我们可以利用npm 的钩子做些什么

1,065 阅读1分钟

钩子

npm 脚本有prepost两个钩子。举例来说,build脚本命令的钩子就是prebuildpostbuild

    "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

自定义的脚本命令也可以加上prepost钩子。比如,myscript这个脚本命令,也有premyscriptpostmyscript钩子。不过,双重的prepost无效,比如prepretestpostposttest是无效的。

我们可以用 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)
}

参考

www.ruanyifeng.com/blog/2016/1…

juejin.cn/post/703356…