也许你不知道的npm-scripts

前言

昨天发了一篇文章《记一次gitHook带来的思考?》,发现npminstalluninstall的时候可以执行脚本,@羽叶丶大佬评论说,可以继续思考下 为何装包时可以运行脚本命令。于是乎今天就去看了一下昨天的主角yorkie,再它的package.json中发现了线索

{
  "scripts": {
    "install": "node bin/install.js",
    "uninstall": "node bin/uninstall.js"
  }
}
复制代码

开始思考

scripts我们应该都知道,可以使用npm run xxx来帮助我们完成一些事情。从昨天的发现到今天的探索来看,scripts很有可能还充当着生命周期的角色。开始查阅npm-scripts文档,看到的结果大吃一惊。原来我们熟知和经常使用的npm run xxx在文档中成为"另外,可以通过这种方式执行任意脚本"。下面看一下也许你不知道的npm-scripts:

scripts的属性

生命周期scripts

  • prepublish:在打包和发布包之前运行,在npm install没有任何参数的本地运行。
  • prepare:在打包和发布包之前运行,在本地npm install:没有任何参数,以及安装git依赖项时运行。这是在之后运行prepublish,但是之前prepublishOnly
  • prepublishOnly:仅在准备和打包之前运行npm publish
  • prepack:前运行压缩包(npm packnpm publish并安装git的依赖时)
  • postpack:在生成压缩包并移动到其最终目的地之后运行。
  • publish postpublish:发布包后运行
  • preinstall:包安装之前运行
  • install postinstall:包安装后运行。默认:node-gyp rebuild,如果binding.gyp包的根目录中有一个文件而您尚未定义自己的脚本installpreinstall脚本,npm将默认install使用node-gyp进行编译。
  • preuninstall uninstall:在包卸载之前运行。
  • postuninstall:在包卸载之后运行。
  • preversion:在碰撞包版本之前运行。
  • version:碰撞包版本之后,但提交之前运行。
  • postversion:碰撞包版本之后,提交之后运行。

主动调用

  • pretest test posttest:由npm test命令运行。
  • prestop stop poststop:由npm stop命令运行。
  • prestart start poststart:由npm start命令运行。默认:node server.js
  • prerestart restart postrestart:按npm restart命令运行。注意:npm restart 如果没有restart提供脚本,将运行停止和启动脚本。 -preshrinkwrap shrinkwrap postshrinkwrap:由npm shrinkwrap命令运行。

其他发现

神秘的.bin

你可能发现有这样一个目录node_modules/.bin,在里面有webpack vue-cli-service这些常见的文件,为什么会有呢?跟上面所说的scripts有一定关系

运行npm start来执行脚本,在npm install时,脚本会导出到node_modules/.bin目录中。

比如node_modules/.bin中存在脚本vue-cli-service

{
  "scripts": {
    "serve": "vue-cli-service serve --open",
  }
}
复制代码

package变量

比如 package.json中存在

{
  "name": "test"
}

process.env.npm_package_name // 值为test
复制代码

说到这,想到一个问题,yorkie要求我们在package.json中填写gitHooks字段,是不是通过这种方式获取的呢?看了一下源码并不是。

const pkg = fs.readFileSync(path.join(cwd, 'package.json'))
const hooks = JSON.parse(pkg).gitHooks
复制代码

钩子脚本

git拥有钩子脚本目录为.git/hooksnpm也有钩子脚本node_modules/.hooks/{eventname}其中evennamescripts字段中的。在这定义的hook将会运用到项目中所有的包。

最后的话

希望大家多多指教,有什么问题欢迎评论区见,在接受批评中共同成长,共同进步。

参考资料

转载于:https://juejin.im/post/5caeffc6f265da03587bea9f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值