用 Node.js 写一个好用的命令行工具
用 Node.js 写一个好用的命令行工具
团队重复创建新项目结构,决定写一个脚手架 CLI。把完整流程和选型记录下来。
基础骨架
#!/usr/bin/env node
// bin/index.js:shebang 声明用 node 执行
import { program } from 'commander'
program
.name('create-xudong-app')
.argument('<name>', '项目名')
.option('-t, --template <name>', '模板名称', 'default')
.action(async (name, options) => {
console.log('创建项目:', name, options.template)
})
program.parse()
package.json 配置 bin 字段,npm link 后即可全局调用:
{ "bin": { "create-xudong-app": "bin/index.js" } }
常用能力库
- commander / cac:参数、子命令、帮助信息解析
- prompts / enquirer / @inquirer/prompts:交互式问答(选择模板、是否 TS)
- picocolors / kleur:终端彩色输出
- ora:loading 转圈(长时间下载时的反馈)
- fs-extra:文件复制、确保目录存在
- execa:执行 git init、npm install 等子进程
模板生成方案
简单场景:把模板放 templates/ 目录,递归读取、变量替换后写入:
import { render } from 'ejs'
const content = render(templateFile, { projectName: name })
await fs.outputFile(path.join(target, relativePath), content)
更现代的做法:模板本身就是一个真实可运行的项目(git 仓库),CLI 只负责 clone/degit 下载 + 重命名 package.json,模板可独立测试维护。
用户体验细节
- 操作前确认目标目录不存在或为空,避免覆盖
- 每一步都有明确反馈:正在做什么、成功/失败原因
- 失败时给出可读的错误信息和非零退出码
- 结束后打印"下一步"指引(cd、npm install、npm run dev)
- 支持 --help 和合理的默认值,零参数也能引导完成
发布
发布到 npm 后用户直接 npx create-xudong-app my-app,无需安装。注意:
- ESM/CJS 兼容性,目标 Node 版本范围
- 敏感路径操作防呆,路径用 path 拼接别手拼字符串
- 版本号语义化,破坏性变更升大版本
写 CLI 是把"重复劳动"自动化的最佳方式,一次投入全团队受益。
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~