【笔记】npm常用命令
Aug 27, 2018笔记工程nodejsnpm 常用命令
官方文档:https://docs.npmjs.com/cli/v7/commands
install 安装
安装一个 node 工具包。安装之前,npm 会先检查node_modules
目录之中是否已经存在指定模块。如果存在就不再安装,即使远程仓库已经有了一个新版本也是。如果要重新安装可以带上参数-f
。如果node_modules
不存在指定模块,则向 registry 查询模块压缩包的网址,然后下载压缩包并放至缓存目录,最后解压压缩包到当前项目的node_modules
目录。
- 别名:
npm i
、npm add
。 - 参数:
[-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]
语法
1 | npm install <name>|[<@scope>/]<name>|[<@scope>/]<name>@<tag>|[<@scope>/]<name>@<version>|[<@scope>/]<name>@<version range>|<git-host>:<git-user>/<repo-name>|<git repo url>|<tarball file>|<tarball url>|<folder> |
参数说明
-P
,--save-prod
:安装包将出现在你的dependencies
中。这是默认值,除非存在-D
或-O
。-D
,--save-dev
:安装包将出现在你的devDependencies
中。-O
,--save-optional
:安装包将出现在你的optionalDependencies
中。--no-save
:不保存在依赖中。-f
,--force
强制重新安装。
如:
1 | npm i moo-css-base -P |
并且,当使用上述任何选项将依赖包保存到 package.json
时,有两个可选参数:
-E
,--save-exact
:保存的依赖包将配置为精确的版本,而不是使用 NPM 的默认 semver range 运算符。-B
,--save-bundle
:保存依赖包的同时将添加你的bundleDependencies
列表。
当然,如果有 npm-shrinkwrap.json
或 package-lock.json
的话,也会更新它们。
<scope>
是可选的,作用是将从与指定作用域关联的注册表下载包。如果没有与给定范围关联的注册表,则假定为默认注册表。
注意:如果你没有在 scope 名字里写入@符号,NPM 将把它解释为一个 Github 存储库,参见下面。作用域名称后面还必须跟一个斜杠。
如:
1 | npm install sax |
全局模式:-g
或--global
生产模式:--production
如果通过--production
参数或 NODE_ENV
环境变量设置为 production
时,npm 将不会安装 devDependencies
的安装包列表。
注意:在项目中安装 dependency 时
--production
参数无效。
–cache-min
--cache-min
参数指定一个时间(单位为分钟),只有超过这个时间的模块,才会从 registry 下载。如
1 | npm install --cache-min 9999999 <package-name> |
要永久,可设置为Infinity
模块安装过程
- 发出
npm install
命令
- 发出
- npm 向 registry 查询模块压缩包的网址
- 下载压缩包,存放在
~/.npm
目录
- 下载压缩包,存放在
- 解压压缩包到当前项目的
node_modules
目录
- 解压压缩包到当前项目的
注意,一个模块安装以后,本地其实保存了两份。一份是
~/.npm
目录下的压缩包,另一份是node_modules
目录下解压后的代码。但是,运行npm install
的时候,只会检查node_modules
目录,而不会检查~/.npm
目录。
*cache 机制
npm install
或npm update
命令,从 registry 下载压缩包之后,都存放在本地的缓存目录。
这个缓存目录,在 Linux 或 Mac 默认是用户主目录下的.npm
目录,在 Windows 默认是%AppData%/npm-cache
。通过配置命令,可以查看这个目录的具体位置。
1 | npm config get cache |
update 更新
缓存目录
执行 npm install
或 npm update
命令后,从 registry 下载的压缩包都存放在本地的缓存目录。
在 Linux 或 Mac 上,这个缓存目录默认是在用户主目录下的.npm
目录。
在 windows 下默认是%AppData%/npm-cache
目录。
通过配置命令可以查看这个目录的位置:
1 | npm config get cache |
清除缓存目录
直接删文件夹或
1 | npm cache clean |
设置缓存时间
npm 提供了一个参数--cache-min
,用于从缓存目录安装模块,该参数指定一个时间,单位为分钟。只有超过这个时间的模块才会从 registry 下载。如
1 | npm instatll --cache-min 9999 fundcharts |
run-script 运行任意包脚本
别名:npm run
语法:
1 | npm run-script <script name> |
run-script 将从包的“scripts”对象运行任意命令。如果没有提供“命令”,它将列出可用的脚本。run[-script]
被用作 test、start、restart 和 stop 等命令,不过也可以直接调用。当包中的脚本打印出来时,它们被分为生命周期(测试、启动、重新启动)和直接运行脚本。
从npm@2.0.0开始,在执行脚本时可以使用自定义参数。getopt 使用特殊选项–来分隔选项的结尾。NPM 将把后面的所有参数直接传递给脚本如:
1 | npm run test -- --grep="pattern" |
参数将只传递到 NPM 运行后指定的脚本,而不传递到任何前脚本或后脚本。
env 脚本是一个特殊的内置命令,可用于列出运行时脚本可用的环境变量。如果在包中定义了“env”命令,它将优先于内置命令。
除了 shell 预先存在的路径之外,npm run 还将 node_modules/
.bin 添加到提供给脚本的路径中。本地安装的依赖项提供的任何二进制文件都可以不使用 node_modules/.bin
前缀。例如,如果您的包中有一个 devdependency on tap,那么您应该编写
1 | "scripts": {"test": "tap test/\*.js"} |
来代替
1 | "scripts": {"test": "node_modules/.bin/tap test/\*.js"} |
来运行你的 test 脚本。
运行脚本的实际 shell 依赖于平台。默认情况下,在类 Unix 系统上,它是/bin/sh
命令,在 Windows 上是 cmd.exe
。/bin/sh
引用的实际 shell 也取决于系统。从`npm@5.1.0`开始,可以使用脚本 shell 配置自定义 shell。
脚本从模块的根目录运行,无论调用 NPM RUN 时当前的工作目录是什么。如果希望脚本根据所处的子目录使用不同的行为,则可以使用 init_cwd 环境变量,该变量保存运行 npm run
时所处的完整路径。
npm run
将 node 环境变量设置为执行 npm 的节点可执行文件。此外,如果传递了--scripts prepend 节点路径
,则节点所在的目录将添加到路径中。如果传递了--scripts prepend node path=auto
(这是 NPM v3 中的默认值),则只有在路径中找不到该节点可执行文件时才会执行此操作。
参数:
--silent
:防止显示 NPM 出错时输出。--if-present
:来避免在未定义脚本时使用非零退出代码退出。这样可以在不破坏执行链的情况下运行可能未定义的脚本。
list 查看安装
语法
1 | npm list |
查看当前各包安装的实际版本。
package-lock.json
package.json
文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版。package-lock.json
是在 npm install
时候生成一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号。
安装包前置
包下载的前置知识
一个包的版本号基本由三位数字构成 x.x.x
, 它们分别是 Major(主版本号), Minor(次版本号), Patch(修订号)。
*
: 升级 Major + Minor + Patch;^
: 升级 Minor + Patch;~
: 升级 Patch;
比如^4.3.1
表示 4.x.x 的最新版,~4.3.1
表示 4.3.x 的最新版
prune 清理模块
使用情景:开发工程中可能使用了某些三方模块(node_modules 目录下),后来又不用了,prune 则可以清除这些不再需要的文件。
语法
1 | npm prune |
prune 原理是根据 package.json 里的依赖项来判断是否删除。
ci 用“干净”状态安装项目
npm 在v5.7.1
起支持。
语法
1 | npm ci |
npm ci
相比 npm install
下的区别:
- 1.项目必须含一个
package-lock.json
或npm-shrinkwrap.json
文件 - 2.如果
package-lock
中的依赖于package.json
中不匹配的话,执行命令会报错并退出执行 - 3.如果
node_modules
已经存在,它将在执行前删除 - 4.它永远不会改写
package.json
或package-lock.json
audit 漏洞扫描
npm 6.x 新增的功能,audit
命令将对项目中配置的依赖项的描述提交给默认注册表,并要求提供已知漏洞的报告。
注意:发送到报告会获取 package-lock.json
/ npm-shrinkwrap.json
的有用信息,所以必须确保这两个文件有一个存在。
返回的报告包含有关如何对这些信息采取行动的说明。如果未发现漏洞,该命令将以 0 退出代码退出。
报告提交内容
- npm 版本
- node 版本
- 平台
- node 控制台变量
- package-lock.json / npm-shrinkwrap.json 的净化版本
修复
您还可以通过运行npm audit fix
使 npm 自动修复漏洞。但请注意,某些漏洞无法自动修复,需要手动干预或检查。还要注意,由于npm audit fix
在后台运行了完整的 npm 安装,因此适用于安装程序的所有配置也将适用于npm install
——因此npm audit fix --package-lock-only
这样的事情将按预期工作。
默认情况下,如果发现任何漏洞,audit 命令将以非零代码退出。在 CI 环境中,包括--audit-level
参数以指定将导致命令失败的最低漏洞级别,可能很有用。
关闭扫描
单项目:安装时增加--no-audit
参数,如npm install example-package-name --no-audit
所有:在用户和全局 npmrc 配置文件中将 audit 设置设置为 false:npm set audit false
其他 npm 执行
1.npm run XXX
执行:
- 1.npm 会先在当前目录的
node_modules/.bin
查找要执行的程序,如果找到则运行; - 2.没有找到则从全局的
node_modules/.bin
中查找,即nom i -g
的模块包; - 3.如果全局目录中还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序。
*npm scripts hook
生命周期 scripts
prepublish
:在打包和发布包之前运行,在npm install
没有任何参数的本地运行。prepare
:在打包和发布包之前运行,在本地npm install
没有任何参数,以及安装 git 依赖项时运行。这是在之后运行 prepublish,但是之前 prepublishOnly
prepublishOnly:仅在准备和打包之前运行npm publish
。prepack
:前运行压缩包(npm pack
,npm publish
并安装 git 的依赖时)postpack
:在生成压缩包并移动到其最终目的地之后运行。publish postpublish
:发布包后运行preinstall
:包安装之前运行install postinstall
:包安装后运行。默认:node-gyp rebuild
,如果 binding.gyp 包的根目录中有一个文件而您尚未定义自己的脚本 install 或 preinstall 脚本,npm 将默认 install 使用 node-gyp 进行编译。preuninstall uninstall
:在包卸载之前运行。postuninstall
:在包卸载之后运行。preversion
:在碰撞包版本之前运行。version
:碰撞包版本之后,但提交之前运行。postversion
:碰撞包版本之后,提交之后运行。
Author
My name is Micheal Wayne and this is my blog.
I am a front-end software engineer.
Contact: michealwayne@163.com