前言
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 即可。
9. 查看一个包的信息
- 查看基本信息:
npm view mongoose
- 查看依赖:
npm view mongoose dependencies
npm view mongoose 其他 package.json 中的字段
- 查看所有版本:
npm view mongoose versions
查看所有版本的好处是,方便回滚或更新一个库!
10. 版本的回滚与更新
10.1 回滚
npm i mongoose@2.9.0
npm i underscore@1.8.3
注意:如果不加 @x.x.x,仅写包名,那么默认下载最新的包。
10.2 更新
-
查看过期的库
npm outdated
Current:当前版本号
Wanted: 期望版本号,主要版本号不可变,以免发生错误。
Latest:最新版本号
-
更新版本
npm update
都更新到了期望版本号。
如果想要更新到最新的版本,可以先进行全部版本的查询,再安装对应的库。
或者利用插件:npm-check-updates,它会将你的 package.json 依赖更新到最新的版本。
npm i -g npm-check-updates
执行检查:
ncu
可以看到,检查的结果,5.13.2是最新版本。运行 ncu -u 就能更新 package.json 文件了。
ncu -u
完成之后,就会发现 json 文件中的 ^2.9.10 变成了 ^5.13.2。
最后,安装依赖,就能将依赖更新到最新的版本了!
npm i
可以用 npm outdated 或 ncu 再次检查下是否还含有过期的包。
11. 仅用于开发的依赖 (DevDenpendencies)
有些依赖库仅用于开发环境,例如静态代码检查、单元测试等等。
加上后缀 --save-dev,告诉 node 这些用于开发环境,不用发布到生产环境。
npm i jshint --save-dev
JSHint is a community-driven tool that detects errors and potential problems in JavaScript code.
12. 包的卸载
npm uninstall 依赖名称
npm un 依赖名称
13. 包的发布
- 新建文件夹 eric-lib-test-1
mkdir eric-lib-test-1
cd eric-lib-test-1
- 初始化包文件
npm init -y
- 添加主文件 index.js
// index.js
module.exports.add = (x, y) => x + y;
- npm 账号登陆
npm login
会让你回答三个问题:用户名、密码、邮箱。
npm logout: npm 账号退出。退出后,如果想要再次发布或更新发布,需要重新登录账号才行!
- 发布
npm publish
- 下载使用
npm i eric-lib-test-1
14. 包的更新
- 更新 index.js 添加乘法。
// index.js
module.exports.add = (x, y) => x + y;
module.exports.multiply = (x, y) => x * y;
- 调整版本号
注意这里可以手动在 package.json 中修改包的版本,也可以通过 npm 命令:
- npm version major:表示大改了接口,主要版本发生变化。(1.0.0 => 2.0.0)
- npm version minor:表示添加了新特性,接口没发生什么变化。(1.0.0 => 1.1.0)
- npm version patch:表示修复了 bug。(1.0.0 => 1.0.1)
这里属于第二种,添加了新特性。
npm version minor
- 发布更新完成的包(要保证 npm 账号是登录状态)
npm publish
综上,是本文的全部内容,涵盖了 npm 包的安装、使用、卸载、发布、更新以及版本号的介绍。
添加我的微信:with_his_x,共同成长,卷卷群里等你 🤪。
以上,感谢您的阅读~