npm相信大伙都用过,package.json文件里面有个scripts指令,比如下面这样的。
{
"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
钩子脚本
git拥有钩子脚本目录为.git/hooks,npm也有钩子脚本node_modules/.hooks/{eventname}其中evenname是scripts字段中的。在这定义的hook将会运用到项目中所有的包。
小结
这篇文章主要是带大伙了解,有兴趣的小伙可以去网上深究,活到老,学到老,多学总没错。