钩子
npm 脚本有pre和post两个钩子。举例来说,build脚本命令的钩子就是prebuild和postbuild。
"prebuild": "echo I run before the build script",
"build": "node scripts/build.js",
"postbuild": "echo I run after the build script"
用户执行npm run build的时候,会自动按照下面的顺序执行。
npm run prebuild && npm run build && npm run postbuild
自定义的脚本命令也可以加上pre和post钩子。比如,myscript这个脚本命令,也有premyscript和postmyscript钩子。不过,双重的pre和post无效,比如prepretest和postposttest是无效的。
我们可以用 npm 中的钩子来达到什么目的?
可以准备一些清理工作
由于 npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面
"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "node scripts/build.js"
统一使用下载工具
假设我们平时下载依赖时都用npm下载依赖他会生成package-lock.json来锁定依赖版本
入过我们的小伙伴和我们一样用npm 自然不会出现什么问题 假设他用yarn或者其他包管理工具呢?会不会突然出现因为小版本不同导致的依赖不兼容的问题呢?
"preinstall": "node ./scripts/preinstall.js",
preinstall文件代码
// 如果获取到npm命令不是npm安装或者为空字符串给出提示并退出执行,process是Node的一个全局对象
// 感兴趣的话可以去了解一下
if (!/npm/.test(process.env.npm_execpath || '')) {
console.warn(
`\u001b[33mThis repository requires using npm as the package manager ` +
` for scripts to work properly.\u001b[39m\n`
)
process.exit(1)
}
参考