什么是脚手架
脚手架本质是一个操作系统的客户端【本质是node是一个客户端】,它通过命令执行,比如:
vue create vue-test-app
上面这条命令由3个部分组成:
- 主命令:vue
- command: cretae
- command的参数:vue-test-app
它表示创建一个vue项目,项目的名称vue-test-app,上面是一个较为简单的脚手架命令,但实际场景更加复杂,比如:当前目录已经有文件了,我们需要覆盖当前目录下的文件,强制进行安装vue的项目,此时就可输入:
vue create vue-test-app --force
这里的--force做option,用来辅助脚手架确认在特定场景下用户的选择(可以理解为配置)。还有一种场景:
通过vue create创建项目时,会自动执行npm install帮用户安装依赖,如果我们希望使用淘宝源来安装,可以输入命令:
vue create vue-test-app --force -r https://registry.npm.taobao.org
这里的-r也叫做option,它与--force不同的是它使用-,并且使用简写,这里的-r也可以替换成--registry,这个简写可以通过如下命令就可以看到vue create支持的所有iptions
vue create --help
-r https://registry.npm.taobao.org的https://registry.npm.taobao.org是option的参数,其实--force可以理解为:--force true,简写为--force或-f
脚手架的执行原理
前置知识:在环境变量中找到vue指令的方法是在终端输入which vue;其中which是Linux系统下可以查找命令的绝对路径,windows系统下没有这个命令,可以使用where代替
上面例子脚手架的执行原理如下:
- 在终端输入
vue create vue-test-app - 终端解析出
vue命令 - 终端在环境变量中找到
vue环境变量 - 终端根据vue命令链接到实际的文件vue.js
- 终端利用node执行vue.js
- vue.js解析command/options
- vue.js指定command
- 执行完毕,退出执行
为什么全局安装@vue/cli后会添加命令vue
正常安装的是npm install -g @vue/cli,正常情况下安装的是vue/cli,为什么命令不是vue/cli;在控制台输入which vue可以得到一个路径,一般这个路径指的是node文件下的bin目录,bin表示可执行文件,全局安装的可执行文件都会放在这里;进入该路径,执行ls -la可以看到vue命令是一个软链接,指向本地安装路径;即vue本质的真实文件是vue.js,可以看到这里面的package文件下的bin配置为vue,所以命令为vue。
$ which vue
$ cd /usr/local/bin
$ ls -la
lrwxr-xr-x 1 admin admin 62 9 2 19:44 vue -> ../../../Users/admin/.config/yarn/global/node_modules/.bin/vue
故一般命令都是根据package文件下的bin配置来生成
全局安装@vue/cli会发生什么?
会先去下载依赖@vue/cli指定的node的bin的node_module里面,然后回去配置bin下面对应的软链接。
#!/usr/bin/env node [在文件的开头可以看到这样一行代码。用于指明该脚本文件要使用node来执行]该行文件的意思是在环境变量中查找到node这个变量,其实也可以写死,但是写死就不灵活了,每个人配置的环境变量路径不一样
node -e"console.log('hello world)"
//会输出"hello world"
脚手架开发流程
1.创建npm项目
2. 创建脚手架入口文件,最上方添加:#!usr/bin/env node
3. 配置package.json添加bin属性
4. 编写脚手架代码
5. 将脚手架发布到npm
开发难点
- 分包:如何将复杂的系统拆分成若干个模块
- 命令注册:
- vue create
- vue add
- vueinvoke
- 参数解析:vue command [options](可以使用node的默认库process,const argv=require('process').argv,其中command=argv[2])
- options的全程
- options的简写
- 带params的options
- 帮助文档
- 命令行打印
- 日志打印等
脚手架本地调试方式
1、npm link进行软链
2、或者全局安装该包,会软链接到源码目录
链接本地脚手架
cd your-cli-dir
npm link
链接本地库文件
cd your-lib-dir
npm link
cd your-cli-dir
npm link your-lib
取消链接本地库文件
```
cd your-lib-dir
npm unlink
cd your-cli-dir
# link存在
npm unlink your-lib
# link不存在
rm -rf node_modules
npm install -S your-lib
```
理解npm link: npm link your-lib:将当前项目中node_modules下指定的库文件链接到node全局node_modules下的库文件; npm link:将当前项目链接到node全局node_modules中作为一个库文件,并解析bin配置创建可执行文件 npm unlink:将当前项目从node全局node_modules中移除 npm unlink your-lib:将当前项目中的库文件依赖移除