ibcadmin 发表于 2019-10-17 09:43:23

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(&#39;readline&#39;);</code>
<p>初始创建</p>
<code>const rl = readline.createInterface({
    /* 监听可读流 */
    input: process.stdin,
    /* 读取写入的 可写流 */
    output: process.stdout,
    /* 提示信息 */
    // prompt: &#39;请输入:&#39;
});</code>
<p>这里会不绝监听用户的输入 当输入template时 创建模板</p>
<code>rl.on(&#39;line&#39;, function(input) {
    if(input === &#39;template&#39;) {
      /* 这里的generator方法参见下方 */
      generatorTemplate.generator()
      rl.close()
    } else if (input === &#39;pause&#39;) {
      rl.pause()
    } else {
      rl.write(&#39;please input right: &#39;);
    }
})</code>
<p>完备代码查察 readline.js</p>
<p>更多用法参考: 官方文档 readline</p>
<h2 id="使用process实现">使用process实现</h2>
<p>当用户输入的内容为template时,就天生模板</p>
<code>const processFn = () => {
    const handleInput = (input) => {
      if(input === &#39;student&#39;) {
            process.stdout.write(&#39;there is student here: hew\n&#39;)
      } else if(input === &#39;template&#39;) {
            /* 这里的generator方法参见 */
            generatorTemplate.generator()
            process.stdin.emit(&#39;end&#39;);
      } else {
            process.stdout.write(&#39;some other input message\n&#39;)
            process.stdin.emit(&#39;end&#39;);
      }
    }
    process.stdin.setEncoding(&#39;utf-8&#39;)
    process.stdin.on(&#39;readable&#39;, () => {
      let chunk = null;
      while ((chunk = process.stdin.read()) !== null) {         
            if (typeof chunk === &#39;string&#39;) {
                chunk = chunk.slice(0, -2);
                if(chunk) {
                  handleInput(chunk)
                } else {
                  process.stdin.emit(&#39;end&#39;);
                }
            }
      }
    })
    process.stdin.on(&#39;end&#39;, () => {
      process.stdout.write(&#39;竣事\n&#39;);
      process.exit()
    })
}</code>
<p>完备代码查察 process.js</p>
<p>更多用法参考: 官方文档 process</p>
<h2 id="使用-inquirer">使用 inquirer</h2>
<code>inquirer
    .prompt([
      {
            type: &#39;confirm&#39;,
            name: &#39;toBeDelivered&#39;,
            message: &#39;是否天生模板?&#39;,
            default: false
      },
      {
            type: &#39;checkbox&#39;,
            name: &#39;choices&#39;,
            message: &#39;Is this for delivery?&#39;,
            default: &#39;check&#39;,
            choices: [&#39;yes&#39;, &#39;no&#39;]
      }
    ])
    .then(answers => {
      console.log(answers);
      /* 输出值为:{ toBeDelivered: true, choices: [ &#39;name&#39; ] } */
      if(answers.toBeDelivered && answers.choices === &#39;yes&#39;) {
            /* 这里的generator方法参见下方 */
            generatorTemplate.generator();
      } else {
            console.log(&#39;不天生模板&#39;);
      }
    });</code>
<p>完备代码查察 inquirer.js</p>
<p>更多用法参考: 官方文档 inquirer</p>
<h2 id="调用的天生模板方法-generator-方法">调用的天生模板方法 (generator 方法)</h2>
<p>generator.js</p>
<code>const fs = require(&#39;fs&#39;);
const path = require(&#39;path&#39;);

const jsStr =
`const a = &#39;&#39;;
const b = 1;
export default {
    a: a,
    b: b
}
`

function generator() {
    fs.mkdirSync(path.join(__dirname, &#39;template&#39;));
    fs.mkdirSync(path.join(__dirname, &#39;template&#39;, &#39;css&#39;));
    fs.mkdirSync(path.join(__dirname, &#39;template&#39;, &#39;js&#39;));
    fs.mkdirSync(path.join(__dirname, &#39;template&#39;, &#39;images&#39;));
   
    fs.writeFileSync(path.join(__dirname, &#39;template&#39;, &#39;js&#39;, &#39;index.js&#39;), jsStr, &#39;utf-8&#39;)
}

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]
查看完整版本: node 利用命令行交互生成相应模板