学习Node.js
2021.06.09 Wed

NodeJS 是运行在服务端的 Javascript,基于 Google 的 Chrome V8 引擎。NPM 是随同 NodeJS 一起安装的包管理工具,用来安装第三方的模块。
通过 node 命令可以运行一个 js 文件node index.js,在命令行里输入 node 可以进入 REPL(Read Eval Print Loop:交互式解释器) 环境运行 js 代码。

初始化一个项目

在项目目录下运行npm init会生成一个 package.json 文件,里面包含了项目的信息。

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "backend",
"version": "0.0.1",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Matti Luukkainen",
"license": "MIT"
}

如上,文件定义的入口点是 index.js,其中 scripts 里的前两个命令可以通过npm start npm test运行

简单的 web 服务器

1
2
3
4
5
6
7
8
9
const http = require('http'); //应用导入Node的内置Web server模块

const app = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello motherfucker');
});
const PORT = 3100;
app.listen(PORT);
console.log(`Server running on port ${PORT}`);

使用 Express

直接使用 Node 内置的 http web 服务器实现我们的服务器代码是可行的。 但是,它很麻烦,特别是当应用规模“变大变长”时。

为了提供一个比内置的 http 模块更友好的界面,许多库已经开发出来,以简化使用 Node 作为服务器端开发。这些库致力于为构建后台服务器的一般的用例提供一个更好的抽象,到目前为止,最受欢迎的库是 express。

安装 express 项目依赖npm install express,事情会在 package.json 记录下来。

1
2
3
4
5
6
{
// ...
"dependencies": {
"express": "^4.17.1"
}
}

依赖的源代码安装在项目根目录中的 node_modules 目录中。 除了 express,你还可以在目录中找到大量的其他依赖项,这些实际上是 express 的依赖项,以及它所有依赖项的依赖项,等等。 这些被称为我们项目的 传递依赖 transitive dependencies 。

  • npm 中的语义版本模型
    npm 的版本号由三部分组成:
    主版本号、次版本号、补丁版本号。变更不同的版本号,代表不同的意义:
    主版本号(major):软件做了不兼容的变更(breaking change 重大变更);
    次版本号(minor):添加功能或者废弃功能,向下兼容;
    补丁版本号(patch):bug 修复,向下兼容。

  • ~version
    不改变主版本号和次版本号,补丁版本号随意
    注意:
    如果按照版本号格式,X.Y.Z,那么补丁版本号就是随意
    如: ~2.2.1, 表示 >=2.2.1 <2.3.0 版的依赖包 (可以是 2.2.1, 2.2.2, 2.2.3, …, 2.2.n)
    如果版本号格式,X.Y,那么跟正规格式的意义相同
    如果版本号格式,X,那么次要版本号和补丁版本号可以随意
    如: ~2, 表示 >=2.0.0 < 3.0.0 版的依赖包 (可以是 2.0.0, 2.0.n, 2.1.0, …, 2.n.n)

  • ^version
    版本号最左边非 0 数字的右侧可以任意
    如: ^2.2.1,表示 >=2.2.1 < 3.0.0 版依赖包
    ^0.2.1,表示 >=0.2.1 <0.3.0 版依赖包
    ^0.0,表示 >=0.0.0 <0.1.0 版依赖包

使用 express 改写上面的代码:

1
2
3
4
5
6
7
8
9
10
11
const express = require('express');
const app = express();

app.get('/', (req, res) => {
res.send('<h1>Hello world!</h1>');
});

const PORT = 3001;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});

设置 npm 代理

1
2
3
npm config set proxy=http://127.0.0.1:10809 #设置代理

npm config delete proxy #取消代理

安装 nodemon

nodemon 将监视启动 nodemon 的目录中的文件,如果任何文件发生更改,nodemon 将自动重启 node 应用。
通过命令npm install -D nodemon将 nodemon 定义为开发依赖 development dependency,package.json 的内容也发生了变化

1
2
3
4
5
6
7
8
9
{
//...
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"nodemon": "^2.0.7"
}
}

通过开发依赖,会指向仅在应用开发过程中需要的工具,例如用于测试或自动重启应用的工具,就像 nodemon。
当应用在生产服务器(例如 Heroku)的生产模式下运行时,并不需要这些开发依赖项。

1
2
3
4
5
6
7
8
9
{
// ..
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js", //添加nodemon命令脚本
"test": "echo \"Error: no test specified\" && exit 1"
}
// ..
}

与 start 和 test 脚本不同,其他的脚本运行命令需要加 runnpm run dev

几种依赖

  • dependencies
    这是 npm 最基本的依赖,npm i xxx来安装一个包并且添加到 package.json 的 dependencies 里面。
    npm i xxx @0.0.1@指明版本号,否则会安装当前包的最新版本
  • devDependencies
    开发中使用的依赖,为了开发方便而使用依赖,如构建工具、预处理器、测试工具等。
    npm i -D xxx 添加到 package.json 的 devDependencies 里面。
  • peerDependencies
    针对的是 npm 包的开发者使用,在项目主体里开发一个插件,这个插件的功能实现并不需要依赖它的项目主体,但是项目主体却还是它的宿主。
    因此当想要使用这个插件的时候,必须也要安装它的宿主项目,peerDependencies 就是声明插件与宿主的关系的。

Node 的模块

  • module.exports={app} 或者 module.exports=app

  • const {app}=require('') 或者 const app=require('')

全局变量

  • __filename 表示当前正在执行的脚本的文件名,输出文件所在位置的绝对路径
  • __dirname 表示当前执行脚本所在的目录
  • process 用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口。
    事件:exit beforeExit uncaughtException Sinal 事件
    属性:stdout stderr stdin argv env...
    方法:abort() chdir() cwd() nextTick(callback)...

文件系统

1
const fs=require('fs)

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
比起同步,异步方法性能更高,速度更快,而且没有阻塞。

  • 读取文件
    fs.readFile(filename[, options], callback)
  • 打开文件
    fs.open(path, flags[, mode], callback)
  • 获取文件信息
    fs.stat(path, callback)
  • 写入文件
    fs.writeFile(file, data[, options], callback)
    ....

参考链接:
Node.js 与 Express
peerDependencies

检测到页面内容有更新,是否刷新页面