← 返回文章列表
Node.js·335 次阅读

用 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 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4