NodeJS 是运行在服务端的 Javascript,基于 Google 的 Chrome V8 引擎。NPM 是随同 NodeJS 一起安装的包管理工具,用来安装第三方的模块。
通过 node 命令可以运行一个 js 文件node index.js
,在命令行里输入 node 可以进入 REPL(Read Eval Print Loop:交互式解释器) 环境运行 js 代码。
初始化一个项目
在项目目录下运行npm init
会生成一个 package.json 文件,里面包含了项目的信息。
1 |
|
如上,文件定义的入口点是 index.js,其中 scripts 里的前两个命令可以通过npm start
npm test
运行
简单的 web 服务器
1 |
|
使用 Express
直接使用 Node 内置的 http web 服务器实现我们的服务器代码是可行的。 但是,它很麻烦,特别是当应用规模“变大变长”时。
为了提供一个比内置的 http 模块更友好的界面,许多库已经开发出来,以简化使用 Node 作为服务器端开发。这些库致力于为构建后台服务器的一般的用例提供一个更好的抽象,到目前为止,最受欢迎的库是 express。
安装 express 项目依赖npm install express
,事情会在 package.json 记录下来。
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 |
|
设置 npm 代理
1 |
|
安装 nodemon
nodemon 将监视启动 nodemon 的目录中的文件,如果任何文件发生更改,nodemon 将自动重启 node 应用。
通过命令npm install -D nodemon
将 nodemon 定义为开发依赖 development dependency,package.json 的内容也发生了变化
1 |
|
通过开发依赖,会指向仅在应用开发过程中需要的工具,例如用于测试或自动重启应用的工具,就像 nodemon。
当应用在生产服务器(例如 Heroku)的生产模式下运行时,并不需要这些开发依赖项。
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 |
|
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)
....