脚手架 CLI
脚手架是什么
本质是一个操作系统的客户端,通过命令执行:如
bash
vue create vue-app
这条命令由主要三个部分组成
- 主命令:
vue
- 指令:
command
:create
- 参数:
param
:vue-app
它表示创建一个vue
项目,名称为vue-app
,以上是一个较为简单的命令,实际场景往往更复杂:
选项 option
:当前目录已经有一个项目了,我们需要进行覆盖,强制安装,此时可以输入:
bash
vue create vue-app --force
这里的 --force
叫做 option
,用来辅助脚手架确认用户在特定场景下的的选择。
还有一种场景: 当我们希望初始化项目时 npm install
使用淘宝源,可以输入:
bash
vue create vue-app --force -r https://registry.npm.taobao.org
这里的-r
也叫做option
,与--force
不同的是它使用-
,并且是简写,-r
也可以换成--registry
,--force
也可以换成-f
。
可以使用以下命令来查看所有的命令:
bash
vue create --help
为什么需要开发脚手架:存在大量重复的工作
- 创建项目+通用代码
- 埋点
- http请求
- 工具方法
- 组件库
git操作
- 创建仓库
- 代码冲突
- 远程代码同步
- 创建版本
- 发布打tag
构建+发布上线
- 依赖安装和构建
- 资源上传
cdn
- 域名绑定
- 测试/正式服务器
脚手架体现的价值
- 自动化:项目重复代码拷贝/git操作/发布上线操作
- 标准化:项目创建/git flow/发布流程/回滚流程
- 数据化:研发过程系统化/数据化/使得研发过程可量化
和自动化构建工具的区别
问题:jenkins
等自动化发布工具已经很成熟了,为什么还要自研脚手架?
- 不能满足需求:不能本地自动化
cli
可定制化
脚手架原理
执行原理
- 输入命令
vue create vue-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
指令并不是由包名称@vue/cli
决定的,而是由@vue/cli
包下的package.json
的bin
字段指定的:
JSON
// package.json
"bin":{
"vue":"bind/vue.js"
}
- 全局安装
@vue/cli
时发生了什么?
将@vue/cli
安装到全局目录,解析package.json
的bin
字段,配置软连接指定vue
命令的执行文件vue.js
。
- 为什么
vue
指向一个js文件,我们却可以直接去执行它?
js文件指定环境变量,使用node环境:
javascript
#!/usr/bin/env node
console.log('hello world')
- 为什么说脚手架是客户端?
实际客户端是指node
,node
给脚手架提供了能力。
- 怎么创建命令别名?
使用软连接
脚手架执行全过程?
执行
vue create vue-app
,终端查询环境变量,获得对应的指令,找到指定文件通过文件的环境配置
#!/usr/bin/env node
在对应环境中执行文件
脚手架功能架构需要考虑什么
- 可扩展:能够快速复用到不同团队、适应不同团队之间的差异
- 低成本:在不改动脚手架源码的情况下,能够更新模板,且新增模板的成本很低
- 高性能:控制存储空间,安装时充分利用
Node
多进程提升安装性能
实现一个脚手架
- 创建
npm
项目 - 创建脚手架入口文件,最上方添加
#!/usr/bin/env node
- 配置
package.json
,添加bin
属性 - 编写脚手架代码
- 将脚手架发布到
npm