你是不是也受够了每天重复输入那些繁琐的命令?每次启动项目都要复制一长串配置,部署时还要记住各种复杂参数。别担心,今天我就带你用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时,我踩过这些坑:
- 忘记在文件顶部加
#!/usr/bin/env node,导致权限错误 - 没有正确处理异步操作,导致提示信息乱序
- 文件路径处理不当,在不同操作系统表现不一致
用path.join()而不是字符串拼接来处理路径,能避免很多跨平台问题!
总结一下
今天我们一起从零打造了一个真正的Node.js命令行工具。记住三个核心步骤:解析参数、交互询问、文件操作。再加上全局安装的技巧,你已经具备了开发实用CLI工具的能力。
最好的学习方式就是动手实践!试着为你经常做的重复工作写一个小工具,哪怕只是自动生成一个模板文件也行。
你已经用过哪些好用的CLI工具?最希望哪个重复工作能被自动化? 在评论区分享你的想法吧!
如果遇到任何问题,欢迎随时提问。祝你的命令行之旅愉快! 🚀
原文链接:https://mp.weixin.qq.com/s/e4Y11rLQAAYbNC4-I89WEQ

被折叠的 条评论
为什么被折叠?



