文章目录
脚手架
脚手架的本质是一个操作系统的客户端,通过命令执行
问题
- 为什么全局安装@vue/cli会添加vue命令
- 全局安装@vue/cli发生了啥
- 执行vue命令时发生了啥?为什么vue指向一个js文件,可以通过vue命令去执行它
脚手架的核心价值
提升前端研发效能
- 自动化:项目重复代码的拷贝/git操作/发布上线操作
- 标准化:项目创建/git flow/发布流程/回滚流程
- 数据化:研发过程系统化、数据化,使得研发过程可量化
与自动化构建工具的区别
jenkins、travis等自动化工具已经比较成熟,是否需要自研脚手架
- 不满足需求:jenkins、travis通常在git hooks中触发,需要在服务端执行,无法覆盖研发人员本地的功能,如创建项目自动化、本地git操作自动化
- 定制复杂:jenkins、travis定制过程复杂,需要使用后端语言
从使用角度理解脚手架
vue create vue-test-app
# - 主命令 vue
# - command:create
# - command的参数:vue-test-app
vue create vue-test-app --force -r https://regisetry.npm.taobao.org
--force
叫做option,用来辅助脚手架确认在特定场景下用户的选择(可以理解为配置)。
-r
也叫做option,与--force
的区别在于使用-
,使用简写,-r
也可以替换为--registry
脚手架原理解析
全局安装@vue/cli时发生了啥
- npm在进行全局安装vue-cli
- 在vue-cli的package.json中查看bin字段
- bin中如果有指令,会在node安装目录的bin文件夹中添加vue的软链接
// package.json
{
"name": "@vue/cli",
...
"bin": {
"vue": "bin/vue.js" // 终端中vue主命令从这里来的
}
}
npm安装vue作为全局依赖的时候,为vue在bin目录中创建了软链接,并指向当前使用的node版本安装路径的lib/node_modules目录中vue-cli中的vue.js
执行vue命令,会查到vue-cli的js文件,但是为什么会被node执行呢
#!/usr/bin/env node
// 上面这行会让操作系统在环境变量中寻找node,nvm可以切换node,也就是修改了环境变量中的PATH
console.log("hello world~")
如何在命令行创建自定义命令
# 先进入node的bin目录
cd ~/.nvm/versions/node/v16.13.1/bin
# 创建软链接
ln -s ~/attacki/source/_posts/backend/nodejs/cli/test.js attr
# 为命令添加别名,软连接是可以嵌套的
ln -s ./attr attr2
# 删除软链接
rm -rf attr attr2
脚手架之所以是客户端,因为node是客户端
脚手架的执行原理
- vue create vue-test-app
- 终端解析vue命令
- 在环境变量$PATH中查询vue的软链接
- 执行vue-cli的bin目录中的vue.js
- 终端利用node执行vue.js
- vue.js第一行声明,会让终端通过环境变量查找node客户端
- vue.js用node执行
- vue.js解析command/options
- vue.js执行command
- 执行完毕,退出
脚手架开发流程
- 创建npm项目 npm init -y
- 创建入口文件,最上方添加 #!/usr/bin/env node
- 配置package.json,添加bin属性
- 编写脚手架代码,将脚手架发布到npm
- 安装脚手架 npm install -g your-own-cli
- 使用脚手架 your-own-cli
脚手架开发难点解析
- 分包:将复杂的系统拆分成若干个模块
- 命令注册:
vue create
vue add
vue invoke
- 参数解析
vue command [options] <params>
- options全称:—version、—help
- options简写:-V、-h
- 带params的options:—path /Users/attacki/Desktop/vue-test
- 帮助文档:
- global help
- Usage
- Options
- Commands
- command help 例如:vue的帮助信息
- global help
- 命令行交互
- 日志打印
- 命令行文字变色
- 网络通信:Http/WebSocket
- 文件处理
node根据路径执行文件
node -e "require('../cli/index.js')"