前言
昨天发了一篇文章《记一次gitHook带来的思考🤔》,发现npm
在install
和uninstall
的时候可以执行脚本,@羽叶丶
大佬评论说,可以继续思考下 为何装包时可以运行脚本命令。于是乎今天就去看了一下昨天的主角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 pack
,npm publish
并安装git的依赖时)postpack
:在生成压缩包并移动到其最终目的地之后运行。publish
postpublish
:发布包后运行preinstall
:包安装之前运行install
postinstall
:包安装后运行。默认:node-gyp rebuild
,如果binding.gyp
包的根目录中有一个文件而您尚未定义自己的脚本install
或preinstall
脚本,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/hooks
,npm
也有钩子脚本node_modules/.hooks/{eventname}
其中evenname
是scripts
字段中的。在这定义的hook
将会运用到项目中所有的包。
最后的话
希望大家多多指教,有什么问题欢迎评论区见,在接受批评中共同成长,共同进步。