包管理工具
npm 包管理工具
npm 即 Node Package Manager (Node 包管理器),对于 Node 而言,NPM 帮助其完成了第三方模块的安装、依赖、发布等。借助 npm,Node 与第三方模块之间形成了很好的一个生态系统。
包的版本管理
我们会发现安装 npm 包时,会出现 ^2.0.3
或 ~2.0.3
这样类似的版本号格式。
这样的版本号格式实际上就是 npm 所遵循的 semver
版本规范。
一个 X.Y.Z
的版本号:
X
表示主版本号,为 0 时,表示正处于开发阶段,不稳定,主版本号升级时,表示做了大量更新,并且包含不兼容旧版本的 APIY
表示次版本号,一些向下兼容的功能性新增就可以升级次版本号Z
表示修订号,修复了一些 BUG,或者向下兼容(没有功能新增)就可以升级修订号
版本号前缀:
^
前缀表示X
不变,Y
和Z
保持最新版本安装~
前缀表示X
和Y
不变,Z
保持最新版本安装*
前缀表示始终保持最新版本安装- 无前缀,则表示安装固定的版本
npm 常用命令
命令 | 说明 |
---|---|
npm install <Module Name> [-g] | 在本地或全局 安装 模块 |
npm uninstall <Module Name> [-g] | 卸载 本地或全局的模块 |
npm update <Module Name> [-g] | 更新 本地或全局安装的模块 |
npm root [-g] | 查看本地或全局中模块 安装路径 |
npm init [-y] | 在本地初始化 package.json |
npm run <command> | 执行本地 package.json 中的脚本 |
npm install
全局安装
$ npm install <Module Name> -g
表示全局安装,一般来说全局安装的模块都是一些工具模块,比如 gulp、webpack、yarn 这些。全局安装的模块会将一些可执行文件配置到环境变量中,这样我们在终端可以全局执行相应的命令了。
- 会将安装包放在 /usr/local 下或者 NodeJS 的安装目录
- 可以在任何路径下直接在命令行中使用包中自带的命令
局部安装
$ npm install <Module Name> [-S] [-D]
表示局部安装,会安装到当前项目的 node_modules 下,加上 -S
参数,会将安装的模块记录到 package.json
中的 dependencies
字段下,加上 -D
参数,会记录到 devDependencies
字段下。
$ npm install <Module Name> -f
默认情况下,安装之前,npm install
会先检查,node_modules
目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f
或--force
参数。
另外在安装模块时,通过 @
后接版本号,可以指定模块的版本:
$ npm install react@~16.0.1
$ npm install redux@^3.7.2
$ npm install lodash@*
- 会将安装包放在运行 npm 命令时所在的目录下的
./node_modules
文件夹中 (没有会自动生成)。 - 可以通过
import
和require()
引入本地安装的包。 - 无法直接在命令行中使用包自带的命令。
对于局部安装的模块
npm update
$ npm update <Module Name>
用于更新一个模块,这和包的版本管理有关,它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
package.json 属性详解
字段 | 说明 |
---|---|
name | 项目名称 |
version | 项目版本号 |
main | 别人导入我们的模块时的加载入口 |
scripts | 定运行脚本命令的 npm 命令行缩写 |
dependencies | 项目生产环境需要的依赖 |
devDependencies | 项目开发环境需要的依赖 |
description | 一个字符串,用于编写描述信息。有助于人们在npm 库中搜索的时候发现你的模块 |
keywords | 一个字符串组成的数组,有助于人们在npm 库中搜索的时候发现你的模块 |
homepage | 项目的主页地址(介绍项目的主页,不是仓库) |
bugs | 用于项目问题的反馈issue地址或者一个邮箱 |
license | 项目的开源协议 |
author | 项目的作者信息 |
private | 取值为布尔类型,表示项目是否私有,如果私有则不会被 publish |
browserlist | 指定该模块供浏览器使用的版本 |
engines | 可以指定该模块正常运行至少要达到的 NPM 和 Node 版本 |
name 与 version
package.json
文件中最重要的就是name
和version
字段,这两项是必填的。名称和版本一起构成一个标识符,该标识符被认为是完全唯一的。每次发布时version
不能与已存在的一致。
name
会作为参数传递给require
,因此它应该是简短的,但也需要具有合理的描述性。
main
指定了加载的入口文件,require
导入的时候就会加载这个文件。这个字段的默认值是模块根目录下面的index.js
。
scripts
指定运行脚本命令的 npm 命令行缩写,比如 start 指定了运行 npm run start 时,所要执行的命令。
"scripts": {
"start": "node ./start.js"
}
当我们在命令行输入 npm run start
时,就会执行 node ./start.js
。
如下字段可以省略 run
:
"scripts": {
"start": "xxx",
"test": "xxx",
"stop": "xxx",
"restart": "xxx"
}
bugs
用于项目问题的反馈issue地址或者一个邮箱。
"bugs": {
"url" : "https://github.com/owner/project/issues",
"email" : "project@hostname.com"
}
author
项目的作者信息。
"author": {
"name" : "yindong",
"email" : "yindong@xx.com",
"url" : "https://zhiqianduan.com/"
}
npx 命令
该命令是 npm 5.2
版本之后自带的一个命令
cnpm
$ npm install cnpm -g
cnpm
的 registry
现在为 https://registry.npmmirror.com
。
yarn
$ npm install yarn -g
yarn
是在 2016
年发布的,那时 npm
还处于 V3
时期,那时候还没有 package-lock.json
文件,就像上面我们提到的:不稳定性、安装速度慢等缺点经常会受到广大开发者吐槽,此时,yarn
诞生。