简述 npm script 的生命周期
Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 740
Author 回答者: shfshanyue
在 npm 中,使用 npm scripts 可以组织整个前端工程的工具链。
{
start: 'serve ./dist',
build: 'webpack',
lint: 'eslint'
}除了可自定义 npm script 外,npm 附带许多内置 scripts,他们无需带 npm run,可直接通过 npm <script> 执行
$ npm install
$ npm test
$ npm publish我们在实际工作中会遇到以下几个问题:
- 在某个 npm 库安装结束后,自动执行操作如何处理?
- npm publish 发布 npm 库时将发布打包后文件,如果遗漏了打包过程如何处理,如何在发布前自动打包?
这就要涉及到一个 npm script 的生命周期
一个 npm script 的生命周期
当我们执行任意 npm run 脚本时,将自动触发 pre/post 的生命周期。
当手动执行 npm run abc 时,将在此之前自动执行 npm run preabc,在此之后自动执行 npm run postabc。
// 自动执行
npm run preabc
npm run abc
// 自动执行
npm run postabcpatch-package 一般会放到 postinstall 中。
{
postinstall: "patch-package";
}而发包的生命周期更为复杂,当执行 npm publish,将自动执行以下脚本。
- prepublishOnly: 最重要的一个生命周期。
- prepack
- prepare
- postpack
- publish
- postpublish
当然你无需完全记住所有的生命周期,如果你需要在发包之前自动做一些事情,如测试、构建等,请在 prepulishOnly 中完成。
{
prepublishOnly: "npm run test && npm run build";
}一个最常用的生命周期
prepare
npm install之后自动执行npm publish之前自动执行
比如 husky
{
prepare: "husky install";
}npm script 钩子的风险
假设某一个第三方库的 npm postinstall 为 rm -rf /,那岂不是又很大的风险?
{
postinstall: "rm -rf /";
}实际上,确实有很多 npm package 被攻击后,就是通过 npm postinstall 自动执行一些事,比如挖矿等。
如果 npm 可以限制某些库的某些 hooks 执行,则可以解决这个问题。