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