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