# 什么是 Shell、Bash、Cli?
# Shell
Shell 是计算机提供给用户与其他程序进行交互的接口,它是一个命令解释器,当你输入命令后,由 Shell 进行解释后交给操作系统内核进行处理,如我们拷贝文件的命令
cp,当我输入这个命令时它实际会去调用操作系统的指令完成操作Shell 分为图形操作系统(GUI Shell)和命令行交互,如电脑上的各种软件属于图形操作系统,而在命令行上输入的则是另一种
Shell 是一个抽象的概念
# Bash
Bash 是一种程序,它的职责是用来进行人机交互,Bash 和其他程序最大区别在于,它不是用来完成特定任务(如计算器、文件管理等),bash shell 是用来执行程序的
Bash 使用的是纯文本的控制台进行控制,而不是图形界面操作系统,这样更加的简单易用
Bash 是 Shell 的具体实现
# Cli
Cli(命令行界面)是一种基于文本界面(类似:MacOS 终端、Windows cmd.exe),用于运行程序
Cli 接受键盘输入,在命令符号提示处输入命令,然后由计算机执行并返回结果
# 总结
Shell 是操作系统提供的接口程序,用于接收用户输入的命令,交给操作系统内核执行并接收响应结果
Bash 是 Shell 的一个实现,用于执行用户输入的命令
Cli 是 Bash 的运行环境,Cli 接收用户键盘输入,交给 Bash 执行,并将程序处理结果以文本形式进行显示

# 从使用角度理解什么是脚手架?
脚手架本质是一个操作系统的客户端,它通过命令行执行,比如:
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
其实 --force 可以理解为 --force true,简写就是 --force 或 -f
# 脚手架执行原理
这里以 vue-cli 为例

执行原理如下:
- 在终端输入
vue create vue-test-app - 终端解析出
vue命令 - 终端在环境变量中找到
vue命令 - 终端根据
vue命令链接到实际文件vue.js - 终端利用
node执行vue.js vue.js解析 command / optionsvue.js执行 command- 执行完毕,退出执行
# 从应用的角度看如何开发一个脚手架
可以通过
which vue命令来找到实际的vue执行的目录
- 开发
npm项目,该项目中应包含一个bin/vue.js文件,并将这个项目发布到npm - 将
npm安装到node的lib/node_modules - 在
node的bin目录下配置vue软链接指向lib/node_modules/@vue/cli/bin/vue.js
这样我们在执行 vue 命令的时候就可以找到 vue.js 进行执行
# 这边有几个核心问题
为什么全局安装
@vue/cli后会添加的命令为vue?因为
@vue/cli项目的package.json中的bin配置``` "bin": { "vue": "bin/vue.js" } ```全局安装
@vue/cli时发生了什么?第一步,会把
@vue/cli下载到全局 node 的lib/node_modules中第二步,解析
package.json的bin配置,如果有,则会在 node 的 bin 目录下创建一个vue的软链接指向lib/node_modules为什么
vue指向一个js文件,我们却可以直接通过vue命令直接去执行它?因为实际的
vue.js文件的头部有声明以下的代码,表示此文件用 node 环境去运行#!/usr/bin/env node1
# 简述脚手架命令执行的全过程

# 脚手架框架
-
- 周下载量 6000w+
- 案例:
- gulp-cli
-
- 周下载量 8000w+
- 案例:
- vue-cli
- webpack-cli
- create-react-app
-
- 脚手架生成器
# 脚手架开发
# 核心点
- 分包:将复杂的系统拆分成若干个模块
- 命令注册
vue create
vue add
vue invoke
2
3
- 参数解析
主要使用 node 的 process 中的 argv
vue command [options] <params>
options 全称:
--version、--helpoptions 简写:
-v、-h带 params 的 options:
--path /Users/chenjie/Desktop/vue-test帮助文档
- global help
- Usage
- Options
- Commands
- command help
- Usage
- Options
- global help
- 命令行交互
- node 内置库
readline - 主要使用第三方库 inquirer (opens new window)
- node 内置库
- 日志打印
- 主要使用第三方库 npmlog (opens new window)
- 命令行文字变色
- 网络通信:HTTP/WebSocket
- 文件处理
- 进度 loading 展示
- 主要使用第三方库 ora (opens new window)
# 开发流程
- 创建
npm项目 - 创建脚手架入口文件,最上方添加:
#!/usr/bin/env node
- 配置
package.json,添加bin属性 - 编写脚手架代码
- 将脚手架发布到
npm
# 开发调试技巧
在本地创建和
npm发布项目同名的文件夹,然后进行npm install -g,这样就会创建一个的软链接就会指向本地的这个项目,而不会指向远程的项目在本地项目中使用
npm link脚手架本地 link 标准流程
- 链接本地脚手架
cd your-cli-dir npm link1
2- 链接本地库文件
cd your-lib-dir npm link cd your-cli-dir npm link your-lib1
2
3
4- 取消链接本地库文件
cd your-lib-dir npm unlink cd your-cli-dir # link 存在 npm unlink your-lib # link 不存在 rm -rf node_modules npm install your-lib -S1
2
3
4
5
6
7
8理解
npm linknpm link your-lib:将当前项目中node_modules下指定的库文件链接到node全局node_modules下的库文件npm link:将当前项目链接到node全局node_modules中作为一个库文件,并解析bin配置创建可执行文件
理解
npm unlinknpm unlink:将当前项目从node全局node_modules中移除npm unlink your-lib:将当前项目中的库文件依赖移除
作者:chenjie
链接:https://webchenjie.cn
来源:ChenJieBlog
