梦入琼楼寒有月,行过石树冻无烟

Node.js 基础

Node.js 是一个基于 Chrome V8 的 JavaScript 运行环境,这也让 JavaScript 成为与 PHP、Python、Perl、Ruby 等服务端语言对等的脚本语言之一。Node.js 能够在服务端运行 JavaScript 的代码和跨平台环境,因此在 node.js 出现以前,JavaScript 经常作为客户端程序设计语言使用。

ECMAScript 是 JavaScript 最初的名字,他由网景公司的 Brendan Eich 所开发的一种脚本语言标准化规范,历经 Mocha、LiveScript 最终成为 JavaScript,并在 1995年由 Sun 正式联合发布 JavaScript

获取 Node.js 的方法非常简单,我们以 Debian Linux 发行版系为例,通过 https://nodejs.org/zh-cn/ 访问 node.js 的官方站点进行下载你需要的版本(本书版本为 10),解压 tar.xz 文件后进入其 bin 目录,比昂通过 ln 建立软链接到 /usr/bin 中,最后通过其 node -v 来查看是否软链接建立成功

1
2
ln node /usr/bin/node
ln npm /usr/bin/node

JavaScript vs Node.js

JavaScript 他本身是一个客户端程序设计语言,因此针对的也是 DOM、BOM、ECMAScript 组合而成,因此针对的也是前端部分,而 Node.js 他主要通过 ECMAScript、OS、File、Net、Databases 等五个部分,分别实现了 JavaScript 语法基础、操作系统交互、文件系统、网络系统和数据库,这也是后端语言最为常用的几个部分,因此他可以脱离浏览器来运行 JavaScript 的项目。

脚本文件运行

创建名称为 hey.js 的文件后,写入 DOM 语法并通过 node.js 来进行运行

1
2
3
4
console.log("Hello,world!")

$ node hey.js
Hello,world!

交互式环境执行

1
2
3
4
5
$ node
> console.log("Hello,world!")
Hello,world!
undefined
>

构建 Node.js 项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const http = require('http');

const hostname = '127.0.0.1';
const port = 8210;

const server = http.createServer((req,res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello,world!\n');
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

至此通过 node index.js 即可运行一个简单的 node 项目,之后点击或访问 console.log 的输出来访问项目视图:http://127.0.0.1:8210/

WebStorm 如果不支持 Node.js 相关语法可以通过在 File -> Setting -> Languages & Frameworks -> JavaScript -> Libraries 内下载 node 语法支持

NPM

NPM(Node Package Manager)Node 包管理器,是 node.js 默认的依赖项之一,通常会随着 node.js 一起被安装,完全由 JavaScript 写成,最初由 lsaac Z.Schlueter 进行开发,2020 年 3 月 16 日 被 Github 收购。

node.js 维护的包管理器允许开发者下载\安装\上传他人\自己编写的第三方包到本地使用\他人使用。

NPM 的包注册(Register)也被称之为 “JavaScript 包注册表”,为了按照名称和版本来解析包,因此 nmp 采用了 CommonJS 包注册规范,这就导致了每个包都会存在一个 Json 格式的元文件。

NPM 名称以 “先到先得” 的原则进行注册,这就不会导致各个模块的名称不会发生错乱,但一旦有人撤回了自己所发布的包,就会导致依赖这个包的项目的对应功能也会出现问题。

你可以通过 nmp -v 的方式来查看版本以及是否正常安装,也可以使用 nmp install npm -g 让其进行升级。

package.json

一个项目中如果存在 package.json 文件,那么可以使用 npm install 命令来自动安装和维护所需要的依赖包,你可以通过使用 npm init 来初始化一个 package.json 文件。

Id Name
name 包名
version 包的版本号采用了语义版本号 X(住版本号).Y(次版本号).Z(补丁版本号) 三位
description 包的描述
main 指定程序的入口文件
scripts 指定了运行脚本命令的 npm 命令行缩写
repository 代码仓库位置
keywords 关键词
author 包作者的名字
license 开源许可证,默认为 (ISC)

package.json 文件可以手写也可以通过 npm init 进行生成(就是回答一些问题后自行进行创建)

从而可以快速体验工作空间以及脚本外壳的使用,因此你需要在初始化后的 CommonJS 包中添加或修改一出信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"name": "demo",
"version": "1.0.0",
"description": "node demo",
"main": "index.js",
"scripts": {
"test": "node index.js"
},
"repository": {
"type": "git",
"url": "https://gitee.com/sif_one/node-demo"
},
"keywords": [
"null"
],
"author": "sun likun",
"license": "ISC"
}

有了 package.json 文件后,可以直接通过 npm install 进行安装所需要的包(在 dependencires 字段中写了),也可以通过指定安装依赖并写入字段的方法进行完善

install express --save``` 参数将所需依赖写入 package.json 文件中的 ```dependencies``` 属性中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

同样的还提供了写入 ```devDependencies``` 属性中的参数 ```--save-dev```

在 ```package.json``` 中,如果在 ```script``` 字段内定义 js 脚本文件,即可通过 ``` npm run test``` 进行运行,此时也就同等于 ```node index.js```

当然也可以通过使用 ```rpm run``` 来查看当前项目所有的 NPM 脚本命令,因为执行该命令时会执行指定的脚本命令,因此只要是 Shell 可以运行的都可以写在 NPM 脚本中。

在大的项目中, npm run 会在 ```node_modules/.bin``` 子目录中加入变量,因此在该目录中的所有脚本都可以字节使用脚本的名称而不需要写成绝对路径。

### 常用命令

| Id | Name | Info |
| --- | --- | --- |
| 1 | ```npm install express``` | 安装某一个模块 |
| | | ```-g``` 全局安装这个模块(也就是说直接在 ```/user/local/bin``` 内直接关联) |
| 2 | ```npm uninstall name``` | 卸载安装的所有模块 |
| | | ```--save``` 以 ```dependencires``` 为目标进行卸载 |
| | | ```--save-dev``` 从 ```devDependencies``` 为目标进行卸载 |
| | | ```--no-save``` 不会将 ```package.json``` 中进行删除依赖 |
| 3 | ```npm update express``` | 更新模块 |
| 4 | ```npm outdated``` | 检查模块版本 |
| 5 | ```npm list``` |查看本地安装的模块 |
| | | ```-g ``` 查看全局安装的模块 |
| 6 | ```npm search express``` | 搜索模块 |
| 7 | ```npm cache clean``` | 清除 NPM 本地缓存 |
| 8 | ```npm start/restart ``` | 启动/重启模块 |

## REPL
REPL(Read Eval Print Loop,交互式解释器),也有另一种解释是:“读取-求值-输出-循环(Read-Eva-Print Loop,REPL)”,表示一个交互式顶层构件,也就是说提供一个简单的交互式编程环境。

Node 也自带了这种交互式解释器,同样可以完成读取、执行、输出、循环的任务,通常你可以直接在终端输入 ```node``` 来进入 node.js 的交互式环境:

```js
1 + 1
2
x = 1
1
y = 1
1
x + y
2
console.log("Hello,world!")
Hello,world!
undefined

var x = 0
undefined
do {
... x++;
... console.log("echo: " + x);
... } while (x < 10);
echo: 1
echo: 2
echo: 3
echo: 4
echo: 5
echo: 6
echo: 7
echo: 8
echo: 9
echo: 10
undefined

交互


REPL 是由node.js所支持的可运行在终端内的控制台窗口即交互式命令环境,按照官方的说法叫“简单的交互式编程环境”,通常就比如你在终端内输入 R,进入R的REPL环境一样,node同样支持。

提示


Node REPL与其他的REPL环境内不同的特点在于,他支持tap键进行补全,以及提示:

1
2
> console.log
[Function: log]

点命令

node.js与 python以及r等 repl交互式环境不同的之处通过点命令可以体现的琳琳尽至,就比如:

python

1
2
3
4
Python 3.9.2 (default, Feb 20 2021, 18:40:11) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

node

1
2
3
4
Welcome to Node.js v15.10.0.
Type ".help" for more information.
> .exit
>
No.x Info 快捷键
.help 显示帮助
.editor 启用编辑模式,可以编写多行的js代码,在editor模式下可通过使用ctrl+D来运行 code
.break 当输入多行表达式的时候,使用break可以中止进一步输入 ctrl+c
.clear 将 REPL上下文设置空占位符,通常等价式为 Linux内的create ,主要用于清除多行表达式
.load 加载 js文件
.save 保存 repl 环境下输入的所有内容
.exit 退出 node.js repl 交互式环境
⬅️ Go back