npm 使用
npm (Node Packaged Modules) is node's official package manager. You can also see all the versions of node and corresponding npm here.
Overview

Acronym
-g
--global
缩写为 -g
,表示安装之后的包将位于系统预设的全局目录之下。
-S
--save
缩写为 -S
,表示安装的包将写入 package.json
里面的 dependencies
。
-D
--save-dev
缩写为 -D
,表示将安装的包将写入 packege.json
里面的 devDependencies
。
-E
--save-exact
缩写为 -E
,表示安装的包的版本是精确指定的。比如 npm install react -E
后 dependencies
中 react 版本为:
"react": "16.13.1"
以下缩写则不是很常用,仅供参考:
-O
--save-optional
缩写为 -O
,表示将安装的包将写入 packege.json
里面的 optionalDependencies
。
-B
--save-bundle
缩写为 -B
,表示将安装的包将写入 packege.json
里面的 bundleDependencies
。
npm outdated
例如在 node 项目中运行 npm outdated
命令,如下图所示:

wanted 就是 dependencies
或 devDependencies
字段中指定的版本号应当升级的版本,可以看出上面列表 less
用的是 ^
,所以 wanted 会提示更新次要版本号。
npm install
Install package
这个是 npm 中最常用的命令:
npm install packageName
可以简写为:
npm i packageName
这个命令会将 package 安装在当前目录下 node_modules
目录内,可执行命令(如果有)安装在 node_modules/.bin
目录下。全局安装使用 -g
选项:
npm install -g packageName # npm i -g packageName
具体安装在 usr
还是 ~
下面,还需要看 node/npm 的安装方式,推荐将 node 安装在 ~
下面,可以使用 nvm 和 n 来安装 node。
如果想指定具体的安装位置,可以使用以下方法:
- 在命令中添加
--prefix
标记 (e.g.npm i -g packageName --prefix ~/.node_modules
)。 - 使用
npm_config_prefix
环境变量。 - 使用用户配置文件
~/.npmrc
。
第一个方法已不被推荐因为你需要记住位置并且每次操作都需要添加参数。第二个方法只是添加下列行到你的 shell 配置文件 (e.g. .bash_profile
, .zshrc
)。
PATH="$HOME/.node_modules/bin:$PATH"
export npm_config_prefix=~/.node_modules
不要忘记source
一下 shell 配置文件。
第三个方法你可以使用命令:
npm config edit
你可以找到 prefix 选项并且设置一个期望的位置:
prefix=~/.node_modules
不要忘记删除行前面的;
否则会被当作注释。你现在可以添加可执行命令的位置到你的 shell 配置文件。
export PATH="$HOME/.node_modules/bin:$PATH"
同样,也不要忘记source
一下 shell 配置文件。
Install local package
在 npm@5 之前的版本,如果将本地目录作为依赖来安装,将会把文件目录作为副本拷贝到 node_modules
中。而在 npm@5 中,将改为使用创建 symlinks 的方式来实现(使用本地 tarball 包除外),而不再执行文件拷贝。这将会提升安装速度:
npm install ../packages/mylib
npm install file://packages/mylib
有关新的 file://
规范描述可以参考官方的 file-specifiers。
Update package
除了安装包,npm i
也可以用于升级包,比如 npm i packageName
将会把 node_modules
中相应的包升级到 wanted
版本,同时也会自动更新 package.json
和 package-lock.json
。
npm i
和 npm i packageName
的行为是不一样的,npm i
会优先去 lockfile 里面找对应的版本,即使有 wanted 的更新版本也不会去下载安装,除非没有 lockfile。
npm --prefix [path] [command]
To run an npm script from another directory, use --prefix
, similar to "yarn --cwd"
npm --prefix ./client install
npm ci
该命令类似于 npm i
,但它旨在用于自动化环境,如测试平台,持续集成和部署。
优点:
- 通过跳过某些面向用户的功能,它可以比
npm i
快得多。 - 可以避免
npm i
增量安装而引起的本地和线上不一致等问题。
例如配置 Travis 以使用 npm ci
而不是 npm i
:
# .travis.yml
install:
- npm ci
# keep the npm cache around to speed up installs
cache:
directories:
- '$HOME/.npm'
总之,使用 npm i
和使用的主要区别 npm ci
是:
- 使用
npm ci
时该项目必须有一个package-lock.json
或npm-shrinkwrap.json
。 npm ci
永远不会写入package.json
或任何 lockfile,安装基本上是冻结的。- 如果 lockfile 中的依赖项与其中的依赖项不匹配
package.json
,npm ci
则将退出并显示错误,而不是更新 lockfile。 - 如果
node_modules
已经存在,它将在npm ci
开始安装之前自动删除。 npm ci
只能一次安装整个项目,使用此命令无法添加单个依赖包。
yarn 没有这个命令,但有一个比较类似的命令:yarn install --frozen-lockfile
npm update
更新包有两种方式 npm i packageName<@version>
或者 npm update packageName
可以简写为:
npm up packageName
npm i
的方式不加版本号和up
的效果是一样的,只更新到wanted
版本,有新版的改动都会更新 package.json 和 lock 文件。npm i
可以加版本号更新到最新版,比如^2.3.0
更新到最新版^3.0.0
之后,package.json 和 lock 文件都会更新,且以插入号的方式来更新 package.json 文件。但是up
命令无论加不加版本号它只会更新到 wanted 版本。
关于 up 命令方面的基础知识
npm update packageName # alias up
对于全局环境安装的包 ( -g
)
npm up -g packageName
更新单个全局包,比如yarn
npm up -g yarn