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 模拟命令行交互的功能,希望达到的几个功能点如下: ...
随机推荐
- js获取一个月的天数
在使用其他语言获取每月天数的时候,一般都是存储到一个数组中进行获取,但是如果是二月份的话就需要首先判断是否闰年,再确定是28还是29了. js可以通过Date对象很方便的获取到每月的天数,在初始化Da ...
- 深度剖析Vue中父给子、子给父、兄弟之间传值!
本片文章将为您详细讲解在Vue中,父给子传值.子给父传值以及兄弟之间传值方式! 父传子:父组件 // template里面 <aa :info="name"/> // ...
- Go依赖管理及Go module使用
Go语言的依赖管理随着版本的更迭正逐渐完善起来. 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面.这就导致了同一个库只能保存一个版本的代码.如果不同 ...
- Python 基础 3 - 元组
元组与列表区别 Python 元组与列表类似,不同之处在于列表可以修改,元组不可以修改 元组用小括号 () 定义,列表用方括号 [] 定义 元组不可修改,列表可修改 元组创建 只需要在小括号 () 内 ...
- MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05
目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...
- WTM送书活动:向更遥远的星辰大海起航~
是的,没错~ 这一篇不是大老刘写的.哈哈~ 啥? 你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了... 然后... 后面请自行脑补~ 哎~生活还要继续鸭.... 那么,接下来由我陪 ...
- PLC与上位机的socket通讯——上位机C#程序(二)
C#的网口通信 一.命令行 客户端程序:using System;using System.Collections.Generic;using System.Linq;using System.Tex ...
- 《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读
一.什么是消息未读 消息未读包括会话未读和总未读.前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和.比如用户A收到用户B的2条消息,还收到用户C的 ...
- Spring Boot 入门之 Cache 篇(四)
博客地址:http://www.moonxy.com 一.前言 Spring Cache 对 Cahce 进行了抽象,提供了 @Cacheable.@CachePut.@CacheEvict 等注解. ...
- centos php7 安装mysqli扩展心得
在新配服务器时发现,php无法连接到mysql.通过phpinfo发现.根本没有显示mysqli的相关配置.经过一系列研究.总结了下.: 第一步: 在phpinfo里没有mysqli配置,原因是安装p ...