马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

node 利用命令行交互生成相应模板

[复制链接]
查看1957 | 回复1 | 2019-10-17 09:43:23 | 显示全部楼层 |阅读模式

目次

  • readline 实现
  • 使用process实现
  • 使用 inquirer
  • 调用的天生模板方法 (generator 方法)
  • 创建时间:2019-10-15
  • 测试环境:win10 node-v10.16.1

vue-cli 初始化项目标启发,想探究其原理和自己实现一套类似方法,以便在项目中创建公用模板块。


这里采用三种方式实现

  1. node 自带的 readline
  2. 使用process实现
  3. 第三方包 inquirer

另有别的实现方式如 commander.js 等,这里不做具体实现

所有实现方式的完备代码 github 链接

链接文件布局如下

  1. <code>|-- generatorTemplate.js (天生模板)
  2. |-- readline.js (readline 方式完备代码)
  3. |-- process.js (process 方式完备代码)
  4. |-- inquirer.js (inquirer 方式完备代码)</code>
复制代码

创建的模板示例:根据用户输入的差别,返回差别结果,包罗实现了天生一个文件夹,文件夹内容如下

  1. <code>|--template
  2. |--css
  3. |--images
  4. |--js
  5. |-- index.js</code>
复制代码

readline 实现

引入 node 自带的 readline

  1. <code>const readline = require(&#39;readline&#39;);</code>
复制代码

初始创建

  1. <code>const rl = readline.createInterface({
  2. /* 监听可读流 */
  3. input: process.stdin,
  4. /* 读取写入的 可写流 */
  5. output: process.stdout,
  6. /* 提示信息 */
  7. // prompt: &#39;请输入:&#39;
  8. });</code>
复制代码

这里会不绝监听用户的输入 当输入template时 创建模板

  1. <code>rl.on(&#39;line&#39;, function(input) {
  2. if(input === &#39;template&#39;) {
  3. /* 这里的generator方法参见下方 */
  4. generatorTemplate.generator()
  5. rl.close()
  6. } else if (input === &#39;pause&#39;) {
  7. rl.pause()
  8. } else {
  9. rl.write(&#39;please input right: &#39;);
  10. }
  11. })</code>
复制代码

完备代码查察 readline.js

更多用法参考: 官方文档 readline

使用process实现

当用户输入的内容为template时,就天生模板

  1. <code>const processFn = () => {
  2. const handleInput = (input) => {
  3. if(input === &#39;student&#39;) {
  4. process.stdout.write(&#39;there is student here: hew\n&#39;)
  5. } else if(input === &#39;template&#39;) {
  6. /* 这里的generator方法参见 */
  7. generatorTemplate.generator()
  8. process.stdin.emit(&#39;end&#39;);
  9. } else {
  10. process.stdout.write(&#39;some other input message\n&#39;)
  11. process.stdin.emit(&#39;end&#39;);
  12. }
  13. }
  14. process.stdin.setEncoding(&#39;utf-8&#39;)
  15. process.stdin.on(&#39;readable&#39;, () => {
  16. let chunk = null;
  17. while ((chunk = process.stdin.read()) !== null) {
  18. if (typeof chunk === &#39;string&#39;) {
  19. chunk = chunk.slice(0, -2);
  20. if(chunk) {
  21. handleInput(chunk)
  22. } else {
  23. process.stdin.emit(&#39;end&#39;);
  24. }
  25. }
  26. }
  27. })
  28. process.stdin.on(&#39;end&#39;, () => {
  29. process.stdout.write(&#39;竣事\n&#39;);
  30. process.exit()
  31. })
  32. }</code>
复制代码

完备代码查察 process.js

更多用法参考: 官方文档 process

使用 inquirer

  1. <code>inquirer
  2. .prompt([
  3. {
  4. type: &#39;confirm&#39;,
  5. name: &#39;toBeDelivered&#39;,
  6. message: &#39;是否天生模板?&#39;,
  7. default: false
  8. },
  9. {
  10. type: &#39;checkbox&#39;,
  11. name: &#39;choices&#39;,
  12. message: &#39;Is this for delivery?&#39;,
  13. default: &#39;check&#39;,
  14. choices: [&#39;yes&#39;, &#39;no&#39;]
  15. }
  16. ])
  17. .then(answers => {
  18. console.log(answers);
  19. /* 输出值为:{ toBeDelivered: true, choices: [ &#39;name&#39; ] } */
  20. if(answers.toBeDelivered && answers.choices[0] === &#39;yes&#39;) {
  21. /* 这里的generator方法参见下方 */
  22. generatorTemplate.generator();
  23. } else {
  24. console.log(&#39;不天生模板&#39;);
  25. }
  26. });</code>
复制代码

完备代码查察 inquirer.js

更多用法参考: 官方文档 inquirer

调用的天生模板方法 (generator 方法)

generator.js

  1. <code>const fs = require(&#39;fs&#39;);
  2. const path = require(&#39;path&#39;);
  3. const jsStr =
  4. `const a = &#39;&#39;;
  5. const b = 1;
  6. export default {
  7. a: a,
  8. b: b
  9. }
  10. `
  11. function generator() {
  12. fs.mkdirSync(path.join(__dirname, &#39;template&#39;));
  13. fs.mkdirSync(path.join(__dirname, &#39;template&#39;, &#39;css&#39;));
  14. fs.mkdirSync(path.join(__dirname, &#39;template&#39;, &#39;js&#39;));
  15. fs.mkdirSync(path.join(__dirname, &#39;template&#39;, &#39;images&#39;));
  16. fs.writeFileSync(path.join(__dirname, &#39;template&#39;, &#39;js&#39;, &#39;index.js&#39;), jsStr, &#39;utf-8&#39;)
  17. }
  18. exports.generator = generator;</code>
复制代码

欢迎交流 Github







来源:https://www.cnblogs.com/he-wei/p/11683588.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则