• 创建时间:2019-10-15
  • 测试环境:win10 node-v10.16.1

vue-cli 初始化项目的启发,想探究其原理和自己实现一套类似方法,以便在项目中创建公用模板块。


这里采用三种方式实现

  1. node 自带的 readline
  2. 使用process实现
  3. 第三方包 inquirer

还有其它实现方式如 commander.js 等,这里不做具体实现

所有实现方式的完整代码 github 链接

链接文件结构如下

|-- generatorTemplate.js (生成模板)
|-- readline.js (readline 方式完整代码)
|-- process.js (process 方式完整代码)
|-- inquirer.js (inquirer 方式完整代码)

创建的模板示例:根据用户输入的不同,返回不同结果,包括实现了生成一个文件夹,文件夹内容如下

|--template
|--css
|--images
|--js
|-- index.js

readline 实现

引入 node 自带的 readline

const readline = require('readline');

初始创建

const rl = readline.createInterface({
/* 监听可读流 */
input: process.stdin,
/* 读取写入的 可写流 */
output: process.stdout,
/* 提示信息 */
// prompt: '请输入:'
});

这里会一直监听用户的输入 当输入template时 创建模板

rl.on('line', function(input) {
if(input === 'template') {
/* 这里的generator方法参见下方 */
generatorTemplate.generator()
rl.close()
} else if (input === 'pause') {
rl.pause()
} else {
rl.write('please input right: ');
}
})

完整代码查看 readline.js

更多用法参考: 官方文档 readline

使用process实现

当用户输入的内容为template时,就生成模板

const processFn = () => {
const handleInput = (input) => {
if(input === 'student') {
process.stdout.write('there is student here: hew\n')
} else if(input === 'template') {
/* 这里的generator方法参见 */
generatorTemplate.generator()
process.stdin.emit('end');
} else {
process.stdout.write('some other input message\n')
process.stdin.emit('end');
}
}
process.stdin.setEncoding('utf-8')
process.stdin.on('readable', () => {
let chunk = null;
while ((chunk = process.stdin.read()) !== null) {
if (typeof chunk === 'string') {
chunk = chunk.slice(0, -2);
if(chunk) {
handleInput(chunk)
} else {
process.stdin.emit('end');
}
}
}
})
process.stdin.on('end', () => {
process.stdout.write('结束\n');
process.exit()
})
}

完整代码查看 process.js

更多用法参考: 官方文档 process

使用 inquirer

inquirer
.prompt([
{
type: 'confirm',
name: 'toBeDelivered',
message: '是否生成模板?',
default: false
},
{
type: 'checkbox',
name: 'choices',
message: 'Is this for delivery?',
default: 'check',
choices: ['yes', 'no']
}
])
.then(answers => {
console.log(answers);
/* 输出值为:{ toBeDelivered: true, choices: [ 'name' ] } */
if(answers.toBeDelivered && answers.choices[0] === 'yes') {
/* 这里的generator方法参见下方 */
generatorTemplate.generator();
} else {
console.log('不生成模板');
}
});

完整代码查看 inquirer.js

更多用法参考: 官方文档 inquirer

调用的生成模板方法 (generator 方法)

generator.js

const fs = require('fs');
const path = require('path'); const jsStr =
`const a = '';
const b = 1;
export default {
a: a,
b: b
}
` function generator() {
fs.mkdirSync(path.join(__dirname, 'template'));
fs.mkdirSync(path.join(__dirname, 'template', 'css'));
fs.mkdirSync(path.join(__dirname, 'template', 'js'));
fs.mkdirSync(path.join(__dirname, 'template', 'images')); fs.writeFileSync(path.join(__dirname, 'template', 'js', 'index.js'), jsStr, 'utf-8')
} exports.generator = generator;

欢迎交流 Github

node 利用命令行交互生成相应模板的更多相关文章

  1. Node.js 命令行工具的编写

    日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作.其编写也不难,和日常编写 Node.js 代码并无二致. package.json 中的 bin 字段 一个 npm 模块, ...

  2. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

  3. libvirt 命令行交互工具之virsh

    libvirt是当前主流VM最低层库.IBM PowerVM也不例外,libvirt是深入玩虚拟化必须玩转的东西; 简单测试玩玩libvirt 的virsh命令行交互工具, 你我都知libvirt大体 ...

  4. Mybatis上路_05-使用命令行自动生成【转】

    http://my.oschina.net/vigiles/blog/125127 Mybatis上路_05-使用命令行自动生成   1人收藏此文章, 我要收藏 发表于1个月前(2013-04-24 ...

  5. 工控随笔_07_西门子_WinCC利用命令行实现操作log日志

    在WinCC中可以通过报警纪录来实现操作员纪录,这个需要WinCC的消息系统进行组态和配置. 利用消息系统进行实现上诉功能不但复杂而且时间久啦也不方便查询.那么有没有一种简单的方法来 实现操作员纪录呢 ...

  6. Node.js 命令行程序开发资料

    Node.js 命令行程序开发教程http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html用Node.js创建命令行工具ht ...

  7. JMeter命令行执行+生成HTML报告

    1.为什么用命令行模式 使用GUI方式启动jmeter,运行线程较多的测试时,会造成内存和CPU的大量消耗,导致客户机卡死: 所以一般采用的方式是在GUI模式下调整测试脚本,再用命令行模式执行: 命令 ...

  8. Node.js 命令行程序开发教程

    nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...

  9. JavaScript实现命令行交互

    原文地址: http://www.cnblogs.com/liaoyu/p/js-terminal.html 周末闲着想试试用 JavaScript 模拟命令行交互的功能,希望达到的几个功能点如下: ...

随机推荐

  1. top_down设计技巧

    写在前面的话 之前梦翼师兄和大家一起学习了层次化设计方法,大家应该懂了,哦,原来所谓的层次化设计就是将一个大的系统不断地拆分成一些便于实现的最小逻辑单元.如果大家真的只是这么想的话,那么梦翼师兄真的是 ...

  2. Intellij IDEA使用restclient测试

    Intellij  IDEA内置了restclient来帮忙我们测试我们的后台代码,让我们可以脱离第三方工具测试,也更不需要我们编写前端代码,直接让我们能想网站发送get,post,put,delet ...

  3. Nginx安装及详解

    Nginx简介: Nginx(发音engine x)专为性能优化而开发的开源软件,是HTTP.反向代理.邮件代理.TCP/UDP协议代理软件,由俄罗斯的作者Igor Sysoev开发,其最知名的优点是 ...

  4. JDK1.8的HashMap数据结构及红黑树

    在JDK1.6,1.7中,HashMap的实现都是用基础的“拉链法”去实现,即数组+链表的形式.如下图:通过不同的hash值,来对数据进行分配存储. 关于HashMap的Entry长度,可以参考htt ...

  5. hive 包含操作(left semi join)(left outer join = in)迪卡尔积

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注 ...

  6. BMP 图像信息隐藏及检测

    原理简介 针对文件结构的信息隐藏方法需详细掌握文件的格式,利用文件结构块之间的关系或根据块数据和块大小之间的关系来隐藏信息. BMP(Bitmap-File)图形文件是 Windows 采用的常见图形 ...

  7. java反射机制,以及对反射机制的了解

    反射是什么?反射有什么用?我相信大家在开始学的时候都会有疑惑,直到如今我学的还不够深入只能简单的说说反射的作用,理论的我也听得很迷糊,接下来我就以几个例子来 写写反射的用处: 494696003群,有 ...

  8. 大数据处理中的Lambda架构和Kappa架构

    首先我们来看一个典型的互联网大数据平台的架构,如下图所示: 在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使 ...

  9. Nginx反向代理之动静分离

    我们已经知道了什么是正向代理与反向代理,这次我们就讲一下Nginx的动静分离的案例,其实质运用的就是反向代理,专门用一台服务器代理服务器上的图片资源. 想使用代理必然要配置代理,配置反向代理,必须要用 ...

  10. The type java.lang.AutoCloseable cannot be resolved. It is indirectly referenced from required .class files

    出现问题: The type java.lang.AutoCloseable cannot be resolved. It is indirectly referenced from required ...