前言
NPM (Node Package Manager) 是一个第三方 Node 包管理工具,一个包就是一个 Node 应用。
本文主要讲解 npm 的一些入门知识,主要包括 npm 包的安装、使用、卸载、发布、更新等内容。
1. npm 包
执行 npm 指令安装所需的包:
- windows:
npm i -g npm@x.x.x
- Mac:
sudo npm i -g npm@x.x.x
i 是 install 的简写,表示安装。
-g 是 --global 的简写,表示在全局安装,而非固定于某个文件夹或工程。
npm@x.x.x 表示安装的包是 npm,版本号是 x.x.x 。
2. package.json
mkdir npm-demo cd npm-demo npm init -y
mkdir: 创建文件夹; cd: 进入文件夹;
npm init -y / npm init --yes: 初始化一个 package.json,里面包含了关于当前应用程序的基本信息。
注意:在你添加任何模块到 node 前,都需要通过上述方式先创建一个 package.json 文件!
3. 包的安装
这里我们安装一个 underscore 库。
npm i underscore --save
npm i underscore
以上两种写法最后的效果是一样的,--save 这个 flag 表示会把包的名字加入到依赖中。(dependencies)
但现在不写这个 flag, 也会把包的名称加入到依赖中。
4. 包的使用
在主目录新建一个 index.js 文件。
// index.js const _ = require('underscore'); const results = _.contains([1, 2, 3], 2); console.log(results); // true
注意:require(path) 查找对应文件的顺序是 Core Module => File or folder => node_modules
- 假设要查找的是以下文件,则会按照注释中的规则来查找:
// example const uploader = require('./uploader'); // ./uploader.js or ./uploader/index.js
不过实际情况可能比这复杂,如果找不到js文件,它还会查找 json 文件等等。
5. 依赖库
通过 npm 可以下载很多依赖库,如何查看?
ls node_modules/
- 一个包实际上就是一个应用,所有应用的依赖以及它所依赖的库都保存在 node_modules 中。
- 另外,如果两个包或多个包同时依赖了同样的库,但是版本不一样。那么它们的依赖将各自保存在自身的文件夹中。
6. 源码控制
node_modules 文件夹的体积会随着项目的发展而不断变大,而实际上我们不想每次都把它提交到仓库,怎么办?那就直接忽略它好了。
那么如何恢复呢?所有下载的包的名字都会在 package.json 中保存下来,所以即便 node_modules 文件夹被删除了也没关系,只要在终端内输入 npm i 就会把依赖重新全部下载下来。
刚刚我们提到,可以在使用 Git 提交代码时,忽略 node_modules 文件夹的提交,那么如何忽略它?
- 初始化一个仓库:
git init
查看 master 分支(也就是主分支)下的文件状态,此时会发现未被提交的列表中含有 node_modules/
git status
- 添加 .gitignore 文件:
// .gitignore node_modules/
重新查看 master 分支的状态:
git status
此时再去提交代码,就不会再把 node_modules/ 提交上去了。
7. 语义化版本控制 (SemVer: Semantic Versioning)
// package.json { "name": "npm-demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "mongoose": "^5.13.1", "underscore": "^1.13.1" } }
其中,dependencies 字段表示当前应用所依赖的库。
7.1 三组数字
例如,第一项 mongoose: "^5.13.1",^
(Caret) 后包含3组数字,中间用.隔开。
- 分别表示:主要版本号.次要版本号.补丁号 (Major.Minor.Patch)
- 当修复一个 bug 后,版本号应该为:5.13.2,即补丁号 + 1;
- 当添加了新的特性且没有破坏现有的接口设置,版本号应该为:5.14.0,即次要版本号 + 1;(如果发现 bug,那么补丁号也会相应增加。)
- 当添加了新的特性且破坏了现有应用的依赖关系,版本号应该为:6.0.0,即主要版本号 + 1.
7.2 数字前的符号
^
5.13.1:告诉 npm 关注当前依赖的任何版本更新,只要主要版本号不变,这里是 5。也就是说,此时如果次要版本号和补丁号发生变化就会下载新的包。
5.13.1:无符号时,等价于 5.x,保持为固定版本。
~
5.13.1:波浪线等价于 5.13.x,补丁号不固定,如果有 bug 修复并更新,那么也会让你的应用保持为最新的状态。
8. 列举已安装的依赖库版本
带符号的依赖都会及时更新为新版本,那么如何查看到底更新到哪个版本了呢?
进入 node_modules 文件夹,找到对应的依赖下的 package.json 文件,里面有个 version 字段,就是当前安装的版本。当需要查看的依赖很多时,这种一个一个点开看的方式就会显得很麻烦。
用命令行的方式:
- 查看并列出所有依赖库的版本:
npm list
- 查看并列出第一层的依赖库版本:
npm list --depth=0
如果要查看其他层级,改变 --depth=x 中的 x 即可。