Open shfshanyue opened 2 years 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 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 一般会放到 postinstall 中。
postinstall
{ postinstall: 'patch-package' }
而发包的生命周期更为复杂,当执行 npm publish,将自动执行以下脚本。
npm publish
当然你无需完全记住所有的生命周期,如果你需要在发包之前自动做一些事情,如测试、构建等,请在 prepulishOnly 中完成。
prepulishOnly
{ prepublishOnly: 'npm run test && npm run build' }
prepare
npm install
比如 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 script 的生命周期
一个 npm script 的生命周期
当我们执行任意
npm run
脚本时,将自动触发pre
/post
的生命周期。当手动执行
npm run abc
时,将在此之前自动执行npm run preabc
,在此之后自动执行npm run postabc
。patch-package 一般会放到
postinstall
中。而发包的生命周期更为复杂,当执行
npm publish
,将自动执行以下脚本。当然你无需完全记住所有的生命周期,如果你需要在发包之前自动做一些事情,如测试、构建等,请在
prepulishOnly
中完成。一个最常用的生命周期
prepare
npm install
之后自动执行npm publish
之前自动执行比如
husky
npm script 钩子的风险
假设某一个第三方库的
npm postinstall
为rm -rf /
,那岂不是又很大的风险?实际上,确实有很多 npm package 被攻击后,就是通过
npm postinstall
自动执行一些事,比如挖矿等。如果 npm 可以限制某些库的某些 hooks 执行,则可以解决这个问题。