原生脚手架概述
研发的视角:开发脚手架的必要性
核心目标是:提升前端研发效能
脚手架核心价值
将研发过程:
- 自动化:项目重复代码拷贝/git 操作/发布上线操作
- 标准化:项目创建/git flow/发布流程/回滚流程
- 数据化:研发过程系统化、数据化,是的研发过程可量化
和自动化构建工具区别
问题:jenkins、travis 等自动化构建工具已经比较成熟了,为什么还需要自研脚手架?
- 不满足需求:jenkins、travis 通常在 git hooks 中触发,需要在服务端执行,无法覆盖研发人员本地的功能,如:创建项目自动化、本地 git 操作自动化等
- 定制复杂:jenkins、travis 定制过程需要开发插件,其过程较为复杂,需要使用 java 语言,对前端同学开发不友好
从使用角度理解什么是脚手架
脚手架简介
脚手架本质是一个操作系统的客户端,它通过命令执行,比如
vue create vue-test-app
上面这条命令由 3 个部分组成:
- 主命令:vue
- command: create
- command 的 param: 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
-r https://registry.npm.taobao.org
后面的 https://registry.npm.taobao.org
成为 option 的 param,其实 --force
可以理解为--force true
,简写为 --force
或 -f
脚手架执行原理
1. which vue
2. ll
3. cd bin/ (bin 下面有一个vue超|软链接)
- 在终端输入
vue create vue-test-app
- 终端解析出 vue 命令
- 终端在环境变量中找到 vue 命令
- 终端根据 vue 命令链接到实际文件 vue.js
- 终端利用 node 执行 vue.js
- vue.js 解析 command/options
- vue.js 执行 command
- 执行完毕,退出执行
从应用的角度看如何开发一个脚手架
这里以 vue-cli 为例
- 开发 npm 项目,该项目中应包含一个
bin/vue.js
文件,并将这个项目发布到npm
- 将 npm 项目安装到 node 的 lib/node_modules
- 在 node 的 bin 目录下配置 vue 软链接指向 lib/node_modules/@vue/cli/bin/vue.js
这样我们在执行 vue 的命令的时候就可以找到 vue.js 进行执行
脚手架的实现原理
QUESTION
-
为什么全局安装 @vue/cli 后会添加的命令为 vue?
npm install -g @vue/cli
通过 which vue 等命令找到 vue 的最终执行文件名称为 vue.js 我们可以在 vue 的文件夹中找到 package.json ,会发现有一个指令为
bin
中配置了相关的安装完包之后 软连接对应的名称vue
以及对应的执行文件bin\vue.js
-
全局安装 @vue/cli 时发生了什么
- npm 将包安装到 node 下面的 node_modules 中
- 当包完全下载完成之后会解析包下面的 package.json 中的 bin,如果发现有这个配置,就会在 node 的 bin 目录下安装一个软链接,指向包的 package.json 中 bin 后面配置的文件
-
为什么 vue 指向一个 js 文件,我们却可以直接通过 vue 命令直接去执行它
-
在执行 vue 命令的时候,操作系统会根据 which vue 命令找到并执行相关文件(执行 vue 和直接执行 which vue 找到的文件地址是一样的)【在环境变量中查找 vue 命令是否被注册,如果没有注册则给出提示,如果注册了 则执行相关的文件】
-
自己写的文件直接执行是执行不起来的
-
添加可执行权限
- chmod 777 自己的文件.js
-
添加完之后直接执行 自己的文件.js 还是执行不起来,为什么呢?JS 文件必须通过一个解释器 node 来进行执行
-
运行 node 自己的文件.js 这时候就能执行起来了
-
-
可以直接执行 vue 是因为在 vue.js 的上方添加了一个环境变量
#!/usr/bin/env node
(为什么可以直接通过命令执行的原因) -
#!/usr/bin/env node 说明
- 这句话告诉我们 到环境变量中查找 node 命令,找到 node 命令后去使用 node 命令来执行
/usr/bin/env node test.js
===./test.js
===node test.js
-
觉得通过./的方式执行不太优雅,想直接通过命令来执行怎么做呢?
- 找到环境变量
echo $PATH
- 在环境变量中创建一个软连接
- pwd 查找当前文件目录地址并拷贝
- 找到本机 node 下的 bin 目录
- 创建软连接
ln -s 命令名称 刚才拷贝的文件目录地址/文件名称
- 这个时候就可以使用命令来进行执行了
- 找到环境变量
-
-
以下两种写法有啥区别?
#!/usr/bin/env node
#!/usr/bin/node- 第一种是在环境变量中查找 Node
- 第二种是直接执行
/usr/bin/
目录下的node
-
为什么说脚手架本质是操作系统的客户端?它和我们在 PC 上安装的应用/软件有什么区别?
- 执行脚手架的时候会发现它其实是作为一个操作系统的可执行文件来进行执行的,所以我们说开发的脚手架就是操作系统上的一个客户端(客户端不是我们编写的脚手架文件)。为什么说它是客户端?因为脚手架执行是依靠 node 命令的,node 是一个操作系统的客户端,而我们的执行文件仅是 node 的一个参数。(Node 本身是一个可执行文件)
- 本质来说没有区别
-
如何为 node 脚手架命令创建别名?
- 通过软链接(可以做嵌套使用)
- ln -s 命令名称 已有的名称
- 通过软链接(可以做嵌套使用)
-
描述脚手架命令执行的全过程-流程图