使用Node.js创建自定义命令行工具并生成项目模板

作者:服务小站时间:2026-10-23 13:05:53浏览:575

本文介绍如何利用Node.js创建自定义命令行工具,通过配置package.json的bin字段实现全局命令调用。结合inquirer库处理用户交互输入,并编写脚本自动从远程获取模板文件,实现路由、控制器及样式文件的一键生成,简化老旧项目的模块添加流程。

前言与背景

前言

在实际工作场景中,维护一些历史悠久的老项目是常见需求。随着项目迭代,手动添加新模块的工作量日益庞大且繁琐。为了提升效率,笔者尝试编写一条Node.js命令,旨在实现配置过程的自动化。该命令能够一键完成路由、控制器以及Less样式文件等必要配置的生成。最终,开发者只需在自动生成的模板文件index.jsx中编写具体的业务逻辑代码即可。

前言与背景

Node命令创建流程

如何创建Node命令?


$ mkdir my-plugin
$ cd my-plugin
$ npm init --yes

首先需要配置package.json文件中的脚本命令部分。这是定义命令行工具入口的关键步骤,通过指定bin字段,可以将脚本映射为可执行命令。


{ "name": "12", "version": "1.0.0", "description": "", "main": "index.js", "scripts": {  "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "bin": {  "autocode": "bin/wflow.js" }, "dependencies": {  "inquirer": "^7.0.0" }}

接下来需要创建对应的脚本JavaScript文件。该文件作为命令的实际执行主体,负责接收参数并执行后续逻辑。


#!/usr/bin/env node
console.log('hello word');

最后一步是将开发好的命令全局安装,使其可以在终端的任何目录下直接调用。


npm install . -g

前言与背景

交互式脚本与模板生成

以上步骤完成了Node指令的基础创建,接下来重点介绍如何编写用于生成代码的脚本逻辑。

inquirer的使用

在脚本中,我们使用inquirer库来增强用户交互体验。以下列举了该库中常用的属性,更复杂的功能建议参考官方文档深入学习。

1.input


const promptList = [{
  type: 'input',
  message: '设置一个用户名:',
  name: 'name',
  default: "test_user" // 默认值
},{
  type: 'input',
  message: '请输入手机号:',
  name: 'phone',
  validate: function(val) {
    if(val.match(/\d{11}/g)) { // 校验位数
      return val;
    }
    return "请输入11位数字";
  }
}];

inquirer.prompt(promptList).then(answers => {});

效果:

前言与背景

2.list


const promptList = [ {  type: "list",  message: "作者帅吗:",  name: "iscool",  choices: ['帅','一般帅'], }, { type: "list", message: "帅得什么级别:", name: "client", choices: ['吴彦祖','彭于晏'], when:function(answers){  return answers.iscool === '帅' }, filter: function(val) { }},];
inquirer.prompt(promptList).then(answers => {});

前言与背景

when属性用于定义此条询问出现的条件,只有当前置问题的回答满足特定逻辑时,该问题才会显示。

编写脚本添加模版

笔者计划添加的模板结构如下所示,旨在覆盖常见的前端模块文件类型。

前言与背景

以在page文件夹下添加index.jsx和index.module.less为例,具体实现逻辑如下:


function action(module_name, module_title) { 
 let url = 'https://raw.githubusercontent.com/justworkhard/Daily-Blog/master/2019-11/12/file/temp.jsx' fs.mkdir("app/page/" + module_name, () => {  fs.writeFileSync("app/page/" + module_name + "/index.module.less", "");  https.get(url,(res)=>{   res.setEncoding('utf8');    let rawData = '';    res.on('data', (chunk) => {    rawData += chunk;   });   res.on('end', () => {    fs.writeFileSync("app/page/" + module_name + "/index.jsx", rawData);   });  }) });
}

首先,在page文件夹下创建对应的module子文件夹。随后,利用Node.js内置的http模块发起请求,将线上仓库中的index.jsx模板文件拉取下来,并写入到刚创建的module文件夹中。

结语

总体而言,通过一条Node指令完成新建模块所需的配置,虽然在绝对时间节省上可能并不显著,但这种自动化的实现方式极具技术趣味性和实用价值。

链接:https://github.com/justworkhard/autocode.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章