详解如何实现一个简单的Node.js脚手架


Posted in Javascript onDecember 04, 2017

原因

在工作中,需要开发一个脚手架,用于给相关用户提供相关的开发便利性。

适合人群

对前端、Node操作有一定的了解,同时向了解脚手架开发过程或者需要自己实现一个脚手架的开发者。

目标

  1. 开发一个简单的脚手架,能够提供给用户进行安装。
  2. 能够输出相关提示。
  3. 对用户文件进行读写操作。
  4. 在脚手架中使用Shell脚本。

步骤

开发脚手架

脚手架的开发最开始过程与普通的前端项目相同,需要一个入口文件command.js和配置文件package.json。

与其他配置文件不同的是,需要在package.json文件中加上一下一项:

{
 ...,
 "bin": {
    "cm-cli": "command.js"
  }
}

在配置文件中增加了此项后,只需要在配置文件根目录下执行npm link命令,即可使用cm-cli --help命令来查看加载的cm-cli脚手架。

如果你发布了你的脚手架,那么在其他用户使用命令npm install -g cm-cli之后,便可以在全局下使用你的脚手架了。

对用户进行提示

在对注释和命令进行提示中,我们需要使用到commander包,使用npm install commander即可进行安装。(如果NPM版本低于5,则需要添加--save参数保证更新package.json配置文件)。

commander是一个提供用户命令行输入和参数解析的强大功能。有需要的可以阅读相关的库文档。在这里我介绍两个用的最多的方法。

option

能够初始化自定义的参数对象,设置关键字和描述,同时还可以设置读取用户输入的参数。具体用法如下:

const commander = require('commander');

commander.version('1.0.0')
  .option('-a, --aaa', 'aaaaa')
  .option('-b, --bbb', 'bbbbb')
  .option('-c, --ccc [name]', 'ccccc')
  .parse(process.argv);


if (commander.aaa) {
  console.log('aaa');
}

if (commander.bbb) {
  console.log('bbb');
}

if (commander.ccc) {
  console.log('ccc', commander.ccc);
}

具体展示如下:

详解如何实现一个简单的Node.js脚手架

command

该方法能够在命令行增加一个命令。用户在执行此命令后,能够执行回调中的逻辑。具体用法如下:

commander
  .command('init <extensionId>')
  .description('init extension project')
  .action((extensionId) => {
    console.log(`init Extension Project "${extensionId}"`);
    // todo something you need
  });

具体展示效果如下:

 详解如何实现一个简单的Node.js脚手架

对用户文件进行读写操作

通过上面的步骤,我们已经能够完成一个简单的脚手架了。下面,我们需要读取用户配置,同时为用户生成一些模板文件。

读取文件

现在,我们需要读取用户的cm-cli.json配置文件来进行一些配置。

我们可以使用Node.js的fs文件模块来对文件进度读操作,由于此处没有太多难点,因此略去。

写入文件模板

我们提前将模板文件存储在CDN上,再根据本地读取到的相关脚手架配置文件来进行模板的下载。

注:脚手架中读取的路径为使用者使用时当前路径,因此没有办法将模板文件存储在脚手架中进行读取。

我们可以使用诸如request这种库来帮助我们进行文件下载,简化操作步骤。执行npm install request`即可进行安装。

注:在文件写入时建议先判断文件是否存在,再进行覆盖。

使用Shell脚本

与Node.js提供的API函数来看,有些人更加倾向于使用Shell脚本来进行文件操作。幸运的是,我们也可以在我们的脚手架中引入node-cmd来启用对Shell脚本的支持。执行npm install node-cmd即可进行安装。

具体示例如下:

commander
  .command('init <extensionId>')
  .description('init extension project')
  .action((extensionId) => {
    id = extensionId;
    console.log(`init Extension Project "${extensionId}"`);

    cmd.get(
      `
      mkdir -p static/${extensionId}

      mkdir tmp
      mkdir tmp/source-file
      mkdir tmp/build-file
      curl -o tmp/source-file/index.js https://xxxxxxxx.com?filename=index.js
      touch tmp/source-file/index.css

      curl -o tmp/build-file/server.js https://xxxxxxxx.com?filename=server.js
      curl -o tmp/build-file/router.js https://xxxxxxxx.com?filename=router.js
      curl -o tmp/build-file/package.json https://xxxxxxxx.com?filename=package.json
      
      cp tmp/source-file/* static/${extensionId}
      cp tmp/build-file/* ./
      rm -fr tmp
      npm install
      `,
      (err, data) => {
        console.log(data)
        if (!err) {
          console.log('init success');
          return;
        }

        console.error('init error');
      });
  });

我们可以快速的使用Shell脚本来进行文件夹的创建和文件模板的下载。

总结

脚手架想要在终端能够快速执行,可以在package.json配置文件中增加相关字段。

脚手架需要能够读取相关终端输入,可以使用commander库来快速开发。

脚手架需要能够执行Shell脚本,可以使用node-cmd库来快速实现需求。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript简单实现图片预加载
Dec 03 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
Dec 05 Javascript
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
jQuery的css() 方法使用指南
May 03 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
Jun 11 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
Aug 08 Javascript
浅谈Vue 性能优化之深挖数组
Dec 11 Javascript
详解Element 指令clickoutside源码分析
Feb 15 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 Javascript
js实现秒表计时器
Dec 16 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
Jul 30 Javascript
浅谈React和Redux的连接react-redux
Dec 04 #Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
Dec 04 #Javascript
深入浅出webpack之externals的使用
Dec 04 #Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 #Javascript
基于JavaScript中字符串的match与replace方法(详解)
Dec 04 #Javascript
基于JSONP原理解析(推荐)
Dec 04 #Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 #Javascript
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
用jscript实现新建word文档
2007/06/15 Javascript
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
javascript 简练的几个函数
2009/08/29 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python实现将文本转换成语音的方法
2015/05/28 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
客户经理岗位职责
2013/12/08 职场文书
后备干部考察材料
2014/02/12 职场文书
绩效管理实施方案
2014/03/19 职场文书
职业规划实施方案
2014/06/10 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
保留意见审计报告
2015/06/05 职场文书
孟佩杰观后感
2015/06/17 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
python ansible自动化运维工具执行流程
2021/06/24 Python
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android