大家都知道, package.json
中的"scripts"
字段非常强大,比如我们常用的npm run build
、npm run test
之类的脚本,我们可以使用这些npm scripts
进行常规的打包、单元测试、lint等等。
大多数人对于npm scripts
的了解仅限于此,实际上npm scripts
还有生命周期的概念,借助官方提供的这些生命周期可以实现非常多的功能。
1、Pre & Post Scripts
pre
和post
是最常见的生命周期钩子,这俩个钩子的含义也非常简单
pre: 在xx脚本之前
post: 在xx脚本之后
{
"scripts": {
"preinstall": "node ./beforeInstall.js",
"postinstall": "node ./afterInstall.js"
}
}
比如最常见的,我们在package.json
中的scripts
字段中添加上面俩段。
所以当我们在安装项目依赖的时候
npm install | yarn
首先会执行preinstall
脚本,按照上面的案例也就是node
执行beforeInstall.js
。至于beforeInstall.js
文件什么内容,实现什么功能,全靠你的想象力,只能是这个想象空间非常巨大,比方说我们可以解决lock
文件和依赖小版本自动升级
的矛盾之类的问题,解决一些狗血的依赖关系问题。
然后preinstall.js
中代码执行完毕之后,开始执行正常的依赖安装命令npm i | yarn
。
在依赖安装完成之后,触发了postinstall
钩子,也就是去执行afterInstall.js
代码。
当然,除了install
这种npm
内置命令之外,pre和post钩子也支持那些npm scripts
中自定义脚本。
{
"scripts": {
"lint": "lint-staged",
"test": "jest",
"compiler": "webpack",
"precompiler": "npm run lint && npm run test",
"postcompiler": "node ./afterBuild.js"
}
}
比如这里的案例precompiler
和postcompiler
(这里故意不使用build
,防止有些同学误认为build
也是npm
内置命令)
当然,上面scripts
中的lint
、test
、compiler
全部都可以加上pre和post钩子,具体使用就不详细说明了。
2、Life Cycle Scripts
除了上面的常用的pre和post钩子之外,还有一些特殊的钩子(生命周期脚本),这些特殊的钩子只是会在特定的场景触发。这些钩子可以理解就是npm
官方提供的特殊生命周期脚本,具体的如下:
prepare
,prepublish
,prepublishOnly
,prepack
,postpack
prepare (npm@4.0.0
之后)
这个钩子触发的场景有很多,具体如下:
-
在
npm pack
命令之前执行这里简单的介绍下
npm pack
命令,这个命令大家都不常用,实际上是官方提供的,给大家本地测试待发布的包,简单的说就是执行npm pack
之后,会生成一个.tgz
文件,和发布到npm
仓库的一致,然后我们可以其他项目对其进行本地测试,简单的添加一下依赖即可:"dependencies": { "some-module": "file:~/some-module-1.0.0.tgz" }
-
在
npm publish
命令之前执行 -
在本地
npm install
命令之前 执行(但是npm install
不能带其他参数) -
在
prepublish
之后, 在prepublishOnly
之前执行
prepublish (已弃用)
-
和
prepare
一致为啥被弃用了,官方有解释,具体不详细说明,有兴趣自己看官方文档
prepublishOnly
- 在
npm publish
之前执行
prepack
-
在
npm pack
之前和npm publish
还有安装git
依赖之前执行这里面
npm publish
命令也会触发npm pack
命令,也就是说实际上你在发布一个包到npm仓库
之前,首先会在本地进行进行打包(.tgz包
) -
NOTE: "
npm run pack
" 和 "npm pack
"不同. "npm run pack
" 用户自定义脚本, 而 "npm pack
" 官方提供的命令
postpack
- 在
npm pack
之后执行。
3、Life Cycle Operation Order
直接从官方搬运,也就是说官方提供的命令的相关的生命周期脚本执行顺序:
npm publish
prepublishOnly
prepare
prepublish
publish
postpublish
npm pack
prepack
postpack
npm install
preinstall
install
postinstall
Also triggers
prepublish
(when on local)prepare
(when on local)
npm start
npm run start
has an npm start
shorthand.
prestart
start
poststart