目次
- readline 实现
- 使用process实现
- 使用 inquirer
- 调用的天生模板方法 (generator 方法)
- 创建时间:2019-10-15
- 测试环境:win10 node-v10.16.1
受 vue-cli 初始化项目标启发,想探究其原理和自己实现一套类似方法,以便在项目中创建公用模板块。
这里采用三种方式实现
- node 自带的
readline
- 使用process实现
- 第三方包
inquirer
另有别的实现方式如 commander.js 等,这里不做具体实现
所有实现方式的完备代码 github 链接
链接文件布局如下 - <code>|-- generatorTemplate.js (天生模板)
- |-- readline.js (readline 方式完备代码)
- |-- process.js (process 方式完备代码)
- |-- inquirer.js (inquirer 方式完备代码)</code>
复制代码
创建的模板示例:根据用户输入的差别,返回差别结果,包罗实现了天生一个文件夹,文件夹内容如下 - <code>|--template
- |--css
- |--images
- |--js
- |-- index.js</code>
复制代码readline 实现
引入 node 自带的 readline - <code>const readline = require('readline');</code>
复制代码初始创建 - <code>const rl = readline.createInterface({
- /* 监听可读流 */
- input: process.stdin,
- /* 读取写入的 可写流 */
- output: process.stdout,
- /* 提示信息 */
- // prompt: '请输入:'
- });</code>
复制代码这里会不绝监听用户的输入 当输入template时 创建模板 - <code>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: ');
- }
- })</code>
复制代码完备代码查察 readline.js
更多用法参考: 官方文档 readline
使用process实现
当用户输入的内容为template时,就天生模板 - <code>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()
- })
- }</code>
复制代码完备代码查察 process.js
更多用法参考: 官方文档 process
使用 inquirer- <code>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('不天生模板');
- }
- });</code>
复制代码完备代码查察 inquirer.js
更多用法参考: 官方文档 inquirer
调用的天生模板方法 (generator 方法)
generator.js - <code>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;</code>
复制代码
欢迎交流 Github
来源:https://www.cnblogs.com/he-wei/p/11683588.html |