告别重复劳动!3行代码写出你的第一个Node.js命令行神器

你是不是也受够了每天重复输入那些繁琐的命令?每次启动项目都要复制一长串配置,部署时还要记住各种复杂参数。别担心,今天我就带你用Node.js打造一个专属命令行工具,让你效率直接起飞!

看完这篇,你不仅能学会CLI开发的核心技巧,还能得到一个完整可用的项目模板。最关键的是,整个过程只需要3行核心代码,小白也能轻松上手!

先来看看我们要做什么

想象一下:每次新建项目都要手动创建文件夹、初始化package.json、安装依赖…现在只要输入一行命令my-cli create project-name,所有步骤自动完成!

是不是很心动?让我们开始吧!

环境准备和项目初始化

首先确保你安装了Node.js(建议版本14+),然后创建一个新目录:

mkdir my-awesome-cli
cd my-awesome-cli
npm init -y

这样我们就有了一个基本的package.json文件,这是CLI工具的起点。

核心第一步:解析命令行参数

这里我们使用commander.js这个神器,它让参数解析变得超级简单:

// 安装依赖:npm install commander
const { program } = require('commander');

// 定义程序的基本信息
program
  .name('my-cli')  // 工具名称
  .description('我的第一个CLI工具')  // 工具描述
  .version('1.0.0');  // 版本号

// 添加create命令
program
  .command('create <project-name>')  // <project-name>表示必填参数
  .description('创建一个新项目')
  .option('-t, --type <type>', '项目类型', 'web')  // 可选参数,默认值web
  .action((name, options) => {
    console.log(`创建项目: ${name}`);
    console.log(`项目类型: ${options.type}`);
    // 这里后续会添加实际创建逻辑
  });

// 解析命令行参数
program.parse();

现在试试运行node index.js create my-project -t node,看看效果!

核心第二步:交互式询问用户

有时候我们需要更多信息,这时候inquirer.js就派上用场了:

// 安装:npm install inquirer
const inquirer = require('inquirer');

// 在刚才的action函数中添加:
const questions = [
  {
    type: 'list',  // 列表选择
    name: 'framework',
    message: '请选择框架:',
    choices: ['Vue', 'React', 'Angular', 'Svelte']
  },
  {
    type: 'confirm',  // 确认选择
    name: 'useRouter',
    message: '是否需要路由?',
    default: true
  },
  {
    type: 'input',  // 文本输入
    name: 'description',
    message: '项目描述:'
  }
];

// 在action中调用
inquirer.prompt(questions).then(answers => {
  console.log('用户选择:', answers);
  // 这里可以继续处理用户输入
});

这样用户就能通过友好界面提供信息,而不是记住一堆命令行参数了!

核心第三步:文件操作和模板生成

知道了用户需求,接下来就是生成文件了。我们使用Node.js自带的fs模块:

const fs = require('fs');
const path = require('path');

// 创建项目目录
const projectPath = path.join(process.cwd(), name);
if (!fs.existsSync(projectPath)) {
  fs.mkdirSync(projectPath);
  console.log(`创建目录: ${projectPath}`);
}

// 生成package.json
const packageJson = {
  name: name,
  version: '1.0.0',
  description: answers.description,
  main: 'index.js',
  scripts: {
    start: 'node index.js'
  }
};

// 写入文件
fs.writeFileSync(
  path.join(projectPath, 'package.json'),
  JSON.stringify(packageJson, null, 2)  // 2空格缩进,让JSON更易读
);

console.log('package.json已创建!');

终极技巧:让命令全局可用

现在我们的工具还只能用node index.js运行,太不专业了!让我们把它变成真正的全局命令:

首先在package.json中添加:

{
  "bin": {
    "my-cli": "./index.js"
  }
}

然后在index.js文件顶部添加shebang(告诉系统用node运行这个文件):

#!/usr/bin/env node

最后执行:

npm link

现在你可以在任何地方直接使用my-cli create my-project了!

完整代码示例

把前面的代码组合起来,我们的完整CLI工具就诞生了:

#!/usr/bin/env node
const { program } = require('commander');
const inquirer = require('inquirer');
const fs = require('fs');
const path = require('path');

program
  .name('my-cli')
  .description('我的第一个CLI工具')
  .version('1.0.0');

program
  .command('create <project-name>')
  .description('创建一个新项目')
  .option('-t, --type <type>', '项目类型', 'web')
  .action(async (name, options) => {
    console.log(`开始创建项目: ${name}`);
    
    // 询问用户更多信息
    const answers = await inquirer.prompt([
      {
        type: 'list',
        name: 'framework',
        message: '请选择框架:',
        choices: ['Vue', 'React', 'Angular']
      },
      {
        type: 'confirm',
        name: 'useRouter',
        message: '是否需要路由?',
        default: true
      }
    ]);
    
    // 创建项目目录
    const projectPath = path.join(process.cwd(), name);
    if (!fs.existsSync(projectPath)) {
      fs.mkdirSync(projectPath);
    }
    
    // 生成package.json
    const packageJson = {
      name: name,
      version: '1.0.0',
      main: 'index.js'
    };
    
    fs.writeFileSync(
      path.join(projectPath, 'package.json'),
      JSON.stringify(packageJson, null, 2)
    );
    
    console.log(`项目 ${name} 创建成功!`);
  });

program.parse();

更进一步:添加颜色和动画

想让你的CLI更酷?试试chalk和ora:

// 安装:npm install chalk ora
const chalk = require('chalk');
const ora = require('ora');

// 使用示例
const spinner = ora('正在创建项目...').start();
setTimeout(() => {
  spinner.succeed(chalk.green('项目创建成功!'));
  console.log(chalk.blue('接下来可以执行:'));
  console.log(chalk.yellow(`cd ${name}`));
  console.log(chalk.yellow('npm install'));
}, 1000);

实际应用场景

掌握了CLI开发,你可以做很多事情:

  • 自动化项目脚手架
  • 代码检查和格式化工具
  • 部署脚本
  • 数据迁移工具
  • 自定义开发工具链

我团队就用自研CLI工具将新项目搭建时间从30分钟缩短到30秒!

避开这些常见坑

刚开始开发CLI时,我踩过这些坑:

  1. 忘记在文件顶部加#!/usr/bin/env node,导致权限错误
  2. 没有正确处理异步操作,导致提示信息乱序
  3. 文件路径处理不当,在不同操作系统表现不一致

path.join()而不是字符串拼接来处理路径,能避免很多跨平台问题!

总结一下

今天我们一起从零打造了一个真正的Node.js命令行工具。记住三个核心步骤:解析参数、交互询问、文件操作。再加上全局安装的技巧,你已经具备了开发实用CLI工具的能力。

最好的学习方式就是动手实践!试着为你经常做的重复工作写一个小工具,哪怕只是自动生成一个模板文件也行。

你已经用过哪些好用的CLI工具?最希望哪个重复工作能被自动化? 在评论区分享你的想法吧!

如果遇到任何问题,欢迎随时提问。祝你的命令行之旅愉快! 🚀

原文链接:https://mp.weixin.qq.com/s/e4Y11rLQAAYbNC4-I89WEQ

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值