大家都知道, 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
prepublishOnlyprepareprepublishpublishpostpublish
npm pack
prepackpostpack
npm install
preinstallinstallpostinstall
Also triggers
prepublish(when on local)prepare(when on local)
npm start
npm run start has an npm start shorthand.
prestartstartpoststart