node 利用命令行交互生成相应模板
- 创建时间:2019-10-15
- 测试环境:win10 node-v10.16.1
受 vue-cli 初始化项目的启发,想探究其原理和自己实现一套类似方法,以便在项目中创建公用模板块。
这里采用三种方式实现
- node 自带的
readline - 使用process实现
- 第三方包
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 利用命令行交互生成相应模板的更多相关文章
- Node.js 命令行工具的编写
日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作.其编写也不难,和日常编写 Node.js 代码并无二致. package.json 中的 bin 字段 一个 npm 模块, ...
- 如何用Node编写命令行工具
0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...
- libvirt 命令行交互工具之virsh
libvirt是当前主流VM最低层库.IBM PowerVM也不例外,libvirt是深入玩虚拟化必须玩转的东西; 简单测试玩玩libvirt 的virsh命令行交互工具, 你我都知libvirt大体 ...
- Mybatis上路_05-使用命令行自动生成【转】
http://my.oschina.net/vigiles/blog/125127 Mybatis上路_05-使用命令行自动生成 1人收藏此文章, 我要收藏 发表于1个月前(2013-04-24 ...
- 工控随笔_07_西门子_WinCC利用命令行实现操作log日志
在WinCC中可以通过报警纪录来实现操作员纪录,这个需要WinCC的消息系统进行组态和配置. 利用消息系统进行实现上诉功能不但复杂而且时间久啦也不方便查询.那么有没有一种简单的方法来 实现操作员纪录呢 ...
- Node.js 命令行程序开发资料
Node.js 命令行程序开发教程http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html用Node.js创建命令行工具ht ...
- JMeter命令行执行+生成HTML报告
1.为什么用命令行模式 使用GUI方式启动jmeter,运行线程较多的测试时,会造成内存和CPU的大量消耗,导致客户机卡死: 所以一般采用的方式是在GUI模式下调整测试脚本,再用命令行模式执行: 命令 ...
- Node.js 命令行程序开发教程
nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...
- JavaScript实现命令行交互
原文地址: http://www.cnblogs.com/liaoyu/p/js-terminal.html 周末闲着想试试用 JavaScript 模拟命令行交互的功能,希望达到的几个功能点如下: ...
随机推荐
- ui、li模拟下拉框
转载:原文地址:https://www.jianshu.com/p/e303e0298e9e 效果图: HTML: <div class="rank_top"> < ...
- hotcss.js Flexible 移动端适配在dpr=2和dpr=3出现的字体大小设置不正确问题.
这段时间一直在用hotcss做移动端适配,做了几个页面没有发现什么问题,后来老大要加快进度,我把项目分出一块给另一个同事做,她发现了一个问题就是字体在dpr=2,dpr=3,的设备上字体大小显示老是不 ...
- Cannot create PoolableConnectionFactory (null, message from server: "Host 'admin-PC' is not allowed to connect to this MySQL server")
1.别人在用自己的tomcat访问我留的查询接口时,出现Cannot create PoolableConnectionFactory (null, message from server: &qu ...
- FreeSql (二十二)Dto 映射查询
适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...
- Docker的优缺点
Docker解决的问题 由于不同的机器有不同的操作系统,以及不同的库和组件,将一个应用程序部署到多台机器上需要进行大量的环境配置操作.(例如经常出现的类似"在我的机器上就没问题"这 ...
- 面试官:服务器安装 JDK 还是 JRE?可以只安装 JRE 吗?
前些日子有知友面试时被问到如题所示的问题,由于他之前没有准备到这些最最基础的知识,没有考虑过这个问题,所以被问到时竟一脸萌币,回答的不是很好.这道题主要考的是对 Java 基础知识的了解,有些同学可能 ...
- django模型层之多表关系
一. 多表操作 数据库表关系之关联字段与外键约束 一对多 book(多) publish(一) 查询<<水浒传>>这本书出版社的地址: select publish_id fr ...
- Hadoop 之 分布式缓存的原理和方法——DistributedCache
1.什么时Hadoop的分布式缓存 答:在执行MapReduce时,可能Mapper之间需要共享一些信息,如果信息量不大,可以将其从HDFS中加载到内存中,这就是Hadoop分布式缓存机制. 2.如何 ...
- python正则表达式字符记录
代码 功能 . 匹配任意1个字符(除了\n) [] 匹配[]中列举的字符 \d 匹配数字,即0-9 \D 匹配非数字, 即不是数字 \s 匹配空白,即空格,tab键 \S 匹配非空白 \w ...
- 程序猿——踩bug之路
从开始这就是一个新的坑,还好今天我们爬上了: 带着Ui界面的编程,最想感谢的是我的搭档乔美萱:此处我觉得需要掌声和尖叫,一路带我从走到飞: 一.结对编程项目:带UI的小初高数学学习软件 1.用户注册功 ...