# npmScript **Repository Path**: bingohello/npmScript ## Basic Information - **Project Name**: npmScript - **Description**: npm脚本 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-08-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 什么是npm脚本 npm允许在package.json文件里面,使用scripts字段定义脚本命令。 "scripts": { "build": "node build.js" } scripts字段是一个对象,它的每个属性,对应一段脚本。比如`build`命令 对应的脚本是`node build.js` npm run build node build.js 这些定义在package.json里面的脚本,就称为npm脚本。它的优点如下: > 项目的相关脚本,可以集中在一个地方 > 不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行`npm run test`即可 > 可以利用npm提供的很多辅助功能 查看当前项目所有npm脚本命令,就可以使用不带任何参数的`npm run`命令 npm run //打印 Scripts available in webpack4.16 via `npm run-script`: build node build.js dev node dev.js # 原理 每次执行`npm run`,就会自动新建一个shell,在这个shell里面执行指定的脚本命令。因此,只要是Shell可以运行的命令,就可以写在npm脚本里。 另外,`npm run`新建的Shell,会将当前目录的`node_modules/.bin`子目录加入`PATH`变量,执行结束后,再将`PATH`变量恢复原样。 这意味着,当前目录的`node_modules/.bin`子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写`mocha test`就可以了 "test": "mocha test" 而不用写成下面这样 "test": "./node_modules/.bin/mocha test" 由于 npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。 npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。 # 执行顺序 如果npm脚本里需要执行多个任务,那么需要明确它们的执行顺序。 如果是并行执行,可以使用`&`符号 npm run build & npm run dev 如果是继发执行(即只有前一个任务成功,才执行下一个任务),可以使用&&符号 npm run build && npm run dev # 默认值 npm对两个脚本提供了默认值。 "start": "node server.js", "install": "node-gyp rebuild" `npm run start`的默认值是`node server.js`,前提是项目根目录下有server.js这个脚本;`npm run install`的默认值是`node-gyp rebuild`,前提是项目根目录下有binding.gyp文件。 # 钩子 npm脚本由pre和post两个钩子。 举个栗子:build脚本的命令的钩子就是prebuild和postbuild "prebuild": "echo run prebuild", "build": "node build.js", "postbuild": "echo run postbuild", 执行`npm run build`时,会自动按照下面执行顺序执行。 npm run prebuild && npm run build && npm run postbuild 因此,可以在这两个钩子里面,完成一些准备工作和清理工作。 # 简写形式 四个常用的 npm 脚本有简写形式。 npm start是npm run start npm stop是npm run stop的简写 npm test是npm run test的简写 npm restart是npm run stop && npm run restart && npm run start的简写 # 变量 console.log(process.env.npm_package_name); //webpack4.16 console.log(process.env.npm_package_version); //1.0.0 通过环境变量process.env对象,拿到package.json的字段值