2-1 脚手架开发入门
1 一周导读

1.1 收获
- 脚手架的实现原理
Lerna
的常见用法- 架构设计技巧和架构图绘制方法
1.2 主要内容
- 学习如何以架构师的角度思考基础架构问题
- 多
Package
项目管理痛点和解决方案,基于Lerna
脚手架框架搭建 imooc-cli
脚手架需求分析和架构设计,架构设计图
1.3 附赠内容
- 脚手架调试技巧
Lerna
源码分析Node
的module
模块分析yargs
使用方法- 剖析
Lerna
架构设计
1.4 关键词
- 脚手架 - 掌握脚手架原理和开发全流程
Lerna
- 解决多Package
项目管理痛点- 架构设计 - 学习大厂基础架构设计思路
1.5 学习方法
- 架构三部曲: 掌握原理 -> 独立思考 -> 总结反思
- 深度剖析优秀开源项目,由表及里,由浅入深
- 视角切换: 多切换到架构师视角,从全局思考问题
2 脚手架开发入门
- 知识脉络和难点解析
- 站在前端研发的视角,分析开发脚手架的必要性
- 从使用角度理解什么是脚手架
- 脚手架的实现原理 -- 难度
- 脚手架的开发流程
2.1 站在前端研发的视角,分析开发脚手架的必要性
1. 研发效能
- 核心目标:提升前端研发效能

2. 脚手架核心价值
将研发过程:
- 自动化:项目重复代码拷贝 /
git
操作 / 发布上线操作 - 标准化:项目创建 /
gitflow
/ 发布流程 / 回滚流程 - 数据化:研发过程系统化 数据化,使得研发过程可量化
3. 和自动化构建工具区别
问题:
jenkins
travis
等自动化构建工具已经比较成熟了,为什么还需要自研脚手架?
- 不满足需求:
jenkins
travis
通常在git hooks
中触发,需要在服务端执行,无法覆盖研发人员本地的功能,如:创建项目自动化、本地git
操作自动化等 - 定制复杂:
jenkins
travis
定制过程需要开发插件,其过程较为复杂,需要使用java
语言,对前端同学不够友好
2.2 从使用角度理解什么是脚手架
1. 脚手架简介
- 脚手架本质是一个操作系统的客户端,它通过命令行执行
vue create vue-test-app --force -r
// 主命令command
command的param
[option
[option的param
] ]
2. 脚手架的执行原理
- 在终端输入
vue create vue-test-app
- 终端解析出
vue
命令 - 终端在环境变量中找到
vue
命令 - 终端根据
vue
命令链接到实际文件vue.js
- 终端利用
node
执行vue.js
vue.js
解析command/options
vue.js
执行command
- 执行完毕,退出执行
3. 从应用的角度看如果实现脚手架开发
以
vue-cli
为例
- 开发
npm
项目,该项目中应包含一个bin/vuejs
文件,并将这个项目发布到npm
- 将
npm
项目安装到node
的lib/node_modules
- 在
node
的bin
目录下配置vue
软链接指向lib/node_modules/@vue/cli/bin/vue.js
这样我们在执行
vue
命令时就可以找到vue.js
进行执行
2.3 脚手架的实现原理
1. 实现原理
- 为什么全局安装
@vue/cli
后会添加的命令为vue


-
全局安装
@vue/cli
时发生了什么?- 下载依赖
node/bin
目录下配置软链接vue ->
-
执行
vue
命令时发生了什么?为什么vue
指向一个js
文件,我们却可以直接通过vue
命令直接去执行它?#!/usr/bin/env node
2. 实现原理 -- 进阶
- 为什么说脚手架本质是操作系统的客户端? 它和我们在PC上安装的应用/软件有什么区别?
node
本身是一个执行文件node test.js
将test.js
(参数) 执行
-
如何为
node
脚手架命令创建别名?- 软链接嵌套
mklink /D <软链接目录> <源目录>
-
描述脚手架命令执行的全过程

2.4 脚手架的开发流程和难点解析
1. 开发流程
- 创建
npm
项目 - 创建脚手架入口文件,最上方添加:
#!/usr/bin/env node
- 配置
package.json
,添加bin
属性编写脚手架代码 - 将脚手架发布到
npm
2. 使用流程
- 安装
npm install -g your-own-cli
- 使用
your-own-cli
3. 脚手架开发难点
- 分包:将复杂的系统拆分成若干个模块
- 命令注册
vue create
vue add
- 参数解析
vue command [options] <params>
- 帮助文档:
-
global help
usage
Options
Commands
vue
的帮助信息 --Usage: vue <command> [options]
-
command help
vue create
的帮助信息 --Usage: create <options> [app-name]
-
2.5 快速入门第一个脚手架
md zmoon-test
创建文件夹npm init -y
初始化npm
项目bin > index.js
文件

- 配置
package.json
,添加bin
属性编写脚手架代码
- 将脚手架发布到
npm
npm login
npm publish
2.6 脚手架本地 link 标准流程
1. 本地调试链接
npm link
zmoon-test
2. 双包本地调试链接
zmoon-test
zmoon-test-lib
方法一
-
zmoon-test-lib
>npm link
C:\Users\Administrator\AppData\Roaming\npm\node_modules\zmoon-test-lib -> D:\myNote\前端架构师\src\zmoon-test-lib
-
zmoon-test
>npm link zmoon-test-lib
D:\myNote\前端架构师\src\zmoon-test\node_modules\zmoon-test-lib -> C:\Users\Administrator\AppData\Roaming\npm
-
zmoon-test
>zmoon-test
verify that the package.json has a valid "main" entry
- 修改
zmoon-test-lib > package.json
--"main": "lib/index.js",
方法二
zmoon-test-lib
>npm publish
zmoon-test
>npm i
zmoon-test
>npm link zmoon-test-lib
3. 总结
- 链接本地脚手架
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 i -S your-lib
- 理解
npm link
:npm link your-lib
:将当前项目中node_modules
下指定的库文件链接到node
全局node_modules
下的库文件npm link
:将当前项目链接到node
全局node_modules
中作为一个库文件,并解析bin
配置创建可执行文件
- 理解
npm unlink
:npm unlink
:将当前项目从node
全局node_modules
中移除npm unlink your-lib
:将当前项目中的库文件依赖移除
2.7 脚手架命令注册和参数解析
1. 实现命令注册
注册一个命令
zmoon-test init
const lib = require('zmoon-test-lib')
const argv = require('process').argv
const command = argv[2]
// zmoon-test init -- init
const options = argv.slice(3)
// zmoon-test init --name vue-test -- [--name, vue-test]
if(options.length > 1) {
let [option, param] = options
option = option.replace('--', '')
if(command) {
if(lib[command]) {
lib[command]({ option, param})
} else {
console.log('无效的命令')
}
} else {
console.log('请输入命令')
}
}
2. 实现参数解析
实现参数解析
--version
if(command.startsWith('--') || command.startsWith('-')) {
const globalOption = command.replace(/--|-/g, '')
if(globalOption == 'version' || globalOption == 'V') {
console.log('^1.0.0')
}
}
2.8 脚手架项目发布
先发布
lib
包
- 通过
npm unlink
-- 解除lib
包本地链接,才能实现远程测试 - 发布
lib
包:npm publish
- 通过
npm unlink
-- 解除zmoon-test
包本地链接,才能实现远程测试 - 通过
npm unlink zmoon-test-lib
-- 解除zmoon-test
与lib
包本地链接,才能实现远程测试 - 发布
zmoon-test
包:npm publish
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)