以往我们学习github 开源项目都需要极大的耐心,断点一点点的调试,有些开源项目为了对标国际化,代码注释都是英文,现在我们迎来了AI时代,Vibe Coding + spec driven让我们的学习效率提升了数倍,能够聚焦到更加核心的架构设计,而不是纠结具体的语法和api的使用(ps:工作中刚好有相关的需求需要学习开源的脚手架架构)。
let`s go 跟着 claude code 逐步掌握 create-unibest CLI 项目
首先init 文档之后(不会使用claude code的同学可以移步其他claude code介绍文章,本文不赘述)
输入以下
学习计划:逐步掌握 create-unibest CLI 项目
我将分 7 个阶段 引导你学习,每个阶段都会:
- 讲解核心概念 - 这个阶段要解决什么问题
- 分析关键代码 - 逐行讲解重要代码段
- API 详解 - 解释使用的核心 API
- 实战演示 - 通过实际执行观察效果
- 知识总结 - 提炼设计思路和最佳实践
📚 学习路线图
阶段 1: 项目入口和构建系统 (15分钟)
- 理解
pnpm create的工作原理 - 分析 esbuild 打包配置
- 掌握 package.json 的 bin 字段
阶段 2: 命令行参数解析 (15分钟)
- minimist 库的使用方法
- 别名和位置参数处理
- 两种执行路径的分支逻辑
阶段 3: 交互式问答系统 (25分钟)
- prompts 库的核心用法
- 动态问题生成技巧
- 链式验证和错误处理
阶段 4: 文件系统操作 (20分钟)
- 目录状态检查逻辑
- 后序遍历删除算法
- Node.js 文件 API 实战
阶段 5: Git 模板下载机制 (20分钟)
- child_process.exec 执行 shell 命令
- 多源容错设计模式
- Promise 异步流程控制
阶段 6: 项目初始化处理 (15分钟)
- JSON 文件读写和修改
- 字符串规范化处理
- 回调机制的扩展设计
阶段 7: 用户体验优化 (15分钟)
- 终端加载动画实现
- 彩色输出和渐变效果
- 清晰的引导提示设计
🎯 执行方式
每个阶段我会:
- 创建一个 详细的解说文档 (Markdown 格式)
- 展示 关键代码片段 和注释
- 提供 实际运行示例 (如果适用)
- 总结 设计模式 和 最佳实践
你可以:
- 按顺序学习所有阶段
- 选择感兴趣的特定阶段深入
- 随时提问或要求更详细的解释
准备好开始了吗?我们从 阶段 1: 项目入口和构建系统 开始!
阶段 1:跟着 create-unibest 走一遍 CLI 构建流程
一篇 60 分钟速读的技术博客,陪你把
create-unibest的入口、构建、发布全链路串起来。
1. CLI 入口到底怎么跑起来的
每次敲 pnpm create unibest demo-app,其实等价于 pnpm dlx create-unibest demo-app,再往下就是 npx 帮忙拉包、执行脚本。真正的关键是 package.json 里那段 bin 配置:它把命令行名字和 outfile.cjs 绑在一起,包管理器才能帮你生成软链接,做到“下载完就能用”。
flowchart LR
A[pnpm create unibest my-app] --> B[查找 create-unibest 包]
B --> C[临时下载到缓存]
C --> D[读取 package.json bin 配置]
D --> E[执行 outfile.cjs]
E --> F[传递 CLI 参数]
这些配置到底图啥
type: "module":源码阶段直接写 ESM,省去各种兼容脑力。files: ["outfile.cjs"]:发包只塞一个产物,几十 KB,用户安装超快。scripts.prepublishOnly = "nr build":publish 前自动打包,彻底杜绝“忘记 build”翻车。
2. 构建:把 TypeScript 挤成一个可执行文件
scripts/build.js 用 esbuild 把 src/index.ts 和所有依赖揉成单个 outfile.cjs,再顺手打上执行权限,直接就能跑。
graph TD
TS[TypeScript 源码] -->|esbuild bundle| CJS[outfile.cjs]
CJS -->|chmod +x| RUN[可执行 CLI]
最小配置心法:
bundle: true:用户机器上不该再装一堆依赖,单文件可执行就完事。format: "cjs"+platform: "node":CLI 还是老老实实用 CJS,对 Node bin 兼容最好。target: "node18":直接享受现代语法,不用再倒腾 polyfill。minify: true:压完只有 ~94 KB,下载和执行都轻盈。
选 esbuild 的理由? 速度快到离谱,原生吃 TypeScript,几行配置就搞定单文件 CLI,换 webpack/rollup 只会多折腾。
3. Shebang:让 CLI 真正“一敲就跑”
src/index.ts 第一行的 #!/usr/bin/env node 会被带到产物里,因此我们才可以直接执行:
./outfile.cjs my-app # ✅
node outfile.cjs # ✅ 备选
相比写死 /usr/local/bin/node,/usr/bin/env node 会自己去 PATH 里找 Node,可移植性好很多。
4. 产物长什么样,发布节奏怎么走
| 属性 | 描述 |
|---|---|
| 文件名 | outfile.cjs |
| 体积 | ~94 KB(已压缩) |
| 权限 | -rwxr-xr-x,可直接执行 |
| 内容 | 所有业务逻辑 + 依赖(minimist、prompts、kolorist...) |
发布流水线就这么简单:
sequenceDiagram
participant Dev as 开发者
participant NPM as npm publish
Dev->>Dev: pnpm build / pnpm dev
Dev->>NPM: pnpm publish
Note over NPM: prepublishOnly -> pnpm build
NPM-->>Dev: 仅上传 outfile.cjs
Dev->>用户: pnpm create unibest
5. 设计原则一口气记住
- 最小发布面:就发一个文件,用户装完马上能用。
- 自动化兜底:
prepublishOnly永远先 build,再 publish。 - 双语法搭配:开发写 ESM/TS,运行用 CJS,两头都舒服。
- 体验优先:
pnpm dev秒测、npm link全局试、模板准备齐全。
6. 常用命令随手查
pnpm build # 打包 outfile.cjs
pnpm dev # 等价 node outfile.cjs
npm link # 全局验证 CLI
pnpm typecheck # tsc --noEmit
pnpm lint # ESLint 检查
pnpm release # 调用 bumpp + npm publish
7. 下一站:参数解析篇
接下来要拆的是命令行参数:minimist 怎么玩别名和位置参数、代码里怎么走不同执行路径、交互式提问有什么套路。很快见。