之前文章分析过vue-cli创建工程项目过程Vue-cli(3.0 + ) 源码分析(一)_夜跑者的博客-CSDN博客_vue-cli源码
这篇文章看看我们经常运行的命令 npm run serve执行过程。
1. 脚本从哪里来
package.json中scripts字段定义脚本命令。scripts字段是一个对象,它的每一个属性,对应一段脚本。如下所示:
"scripts": {
"serve": "vue-cli-service serve ",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"inspect": "vue-cli-service inspect"
},
npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。当我们运行npm run serve时,其实运行的是./node_modules/.bin/vue-cli-service 脚本。那么./node_modules/.bin/vue-cli-service 脚本怎么来的呢?其实./node_modules/.bin/vue-cli-service 是个符号链接,指向了./node_modules/下安装vue-cli-service的地方,如下所示:
cli-service是在vue-cli创建项目工程时安装的一个核心插件,这个核心插件中的package.json中有bin字段,如下所示:
如果package.json中有bin字段,那么在安装这个库的过程中,就会在./node_modules/.bin目录下生成一个符号链接指向当前目录下定义脚本文件的地方。
到这里我们弄清楚了,运行npm run serve,就是运行./node_modules/cli-service/bin/vue-cli-service.js 脚本文件, serve 是参数。下面就开始分析一下脚本执行过程
2. 执行脚本过程- 安装插件
vue-cli-service.js脚本非常简单,总共不到40行,源码如下:
#!/usr/bin/env node
const { semver, error } = require('@vue/cli-shared-utils')
const requiredVersion = require('../package.json').engines.node
if (!semver.satisfies(process.version, requiredVersion, { includePrerelease: true })) {
error(
`You are using Node ${process.version}, but vue-cli-service ` +
`requires Node ${requiredVersion}.\nPlease upgrade your Node version.`
)
process.exit(1)
}
const Service = require('../lib/Service')
const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())
const rawArgv = process.argv.slice(2)
const args = require('minimist')(rawArgv, {
boolean: [
// build
'modern',
'report',
'report-json',
'inline-vue',
'watch',
// serve
'open',
'copy',
'https',
// inspect
'verbose'
]
})
const command = args._[0]
console.log('liubbc command: ', command, '; args: ', args, '; rawArgv: ', rawArgv)
service.run(command, args, rawArgv).catch(err => {
error(err)
process.exit(1)
})
new 了一个service对象,执行对象的run方法,就这么简单。先看一下传给run方法的打印:
看下service的构