Leader:写一个快速创建 Node 项目的 CLI 工具, 不难吧?

3,561 阅读6分钟

「本文正在参与技术专题征文Node.js进阶之路,点击查看详情

前言

大家好,我是 koala,一个有趣且乐于分享的人,目前专注完整的 Node.js 技术栈分享,工作中负责部门中台搭建以及低代码平台的一些能力。如果你对 Node.js 学习感兴趣的话(后续有计划也可以),可以关注我,加我微信【ikoala520】,拉你进交流群一起交流、学习、共建,或者关注我的公众号程序员成长指北。Github 博客开源项目 github.com/koala-codin…

代码已开源, 源码地址:

https://github.com/koala-coding/create-bff-service-cli

npm 地址:

https://www.npmjs.com/package/create-bff-service-cli

介绍

快速搭建一个基于 egg框架 的 bff-service cli工具。

  • 服务模版多种语言可选模 typescript/javascript (建议选择 typescript,目前只添加了typescript 模版)
  • 模版内容支持根据 CLI 动态交互配置,具体可配置内容可看下文参数说明
  • 服务模版编码规范已完善,已添加 eslintprettiertsconfig 配置等,并且支持自动保存校验,.vscodesettings.json 已配置 。
  • 提供了基本项目结构 routercontrollerserviceconfig 配置等,可直接测试template中提供的基础接口。

技术实现

Cli 流程图

640.png

使用的模块介绍

  1. commander: 提供了用户命令行输入和参数解析的工具
  2. chalk: 可以实现好看的日志输出
  3. inquirer: 一个强大的用户与命令行交互的工具
  4. listr: 可以在命令行中画出进度列表的工具
  5. ncp: 可以实现跨平台递归拷贝文件
  6. pkg-install: 可以使用 yarn installnpm install 安装依赖
  7. semver: 专门分析语义化版本的工具
  8. shelljs:同步的可以只想 shell脚本工具
  9. execa: 可以衍生一个 shell,传入 command 字符串在该 shell 直接处理的子进程管理工具,支持 promise 回调

相较于一些网上的 CLI 文章增加的一些考虑点

  1. 模块更新的检查(比如公司内使用,可以强制检查更新)
  2. 模版代码基于Egg,并对Typescript模块代码进行了工程化配置(eslint,prettier 等),开箱即用。
  3. 支持模版代码的依赖安装 ,目前使用的 yarn
  4. 支持模版代码的 git 初始化

代码实现

代码实现,直接贴一下源码地址(看完前面部分可以先自己实现一下 CLI ,对比学习下,也可给我提一下建议,共同进步) 对于 BFF 这个只是个基础版本,后面会不断完善。

源码地址:

https://github.com/koala-coding/create-bff-service-cli

如果对你有帮助可以点个 star 哦!感谢!

写完 CLI 一点感想,希望有所帮助

模型思想

建立模型思想,做一个功能时候可以考虑是不是一个模型,如果是模型会不会考虑抽离出来,比如这个cli 用到的 npm模块,inquirer,相信写过 cli 的小伙伴都有用过这个模块,我理解它就是一个模型,其实就是一个问答系统模型(更通俗的说就是个问卷答题模型,1题选择A,跳到 3 题,1 题选择B跳到2,我想大家应该都玩过这个问答,考虑一下具体实现,再去看看inquirer,也会有所收获)

插件思想

建立插件思想babelwebpack 的强大之处,绝对离不开他们的插件机制。我们在工作中也可以多考虑到这一点, 举个例子:比如本文如何对一个cli工具建立可插拔的plugin插件机制,因为 CLI 可能会给多个部门创建 BFF 服务使用,不同的业务可能要创建的 BFF 有所区别,有的需要加入动态脚本执行机制,做大计算,有的并不需要这种功能,CLI 创建项目时候可以不加入,这时候就可以把 动态脚本执行模块单独封装成一个插件。

不知道 Node学什么 ???

NPM 官网真的有很多优秀的模块包!,去上面找两个都能学到一些的。比如这次写CLI用到的几个,举两个例子:ncp 模块,网上一些文章也都实现了拷贝,但是是否考虑到了跨平台等,可以看下 ncp 的实现。 execa 模块,都知道 node中也有执行shell脚本的模块,为什么选择它呢?它是如何支持 promise 的。

后续更新迭代内容

  1. 增加 plugin 插件机制,感兴趣的小伙伴可以一起讨论或者提 pr
  2. BFF-SDK 融入,这是 BFF 核心部分,还没有考虑好哪些功能是可以开源的。后面会更新一篇 《一个优雅的 BFF-SDK 应该包含哪些功能》

CLI 快速开始

使用前的准备工作

  1. 安装 node.js

    node.js安装可以官网下载安装,nodejs.org/

    也可以使用 nvs安装,方便切换版本,github.com/jasongin/nv…

  2. 安装 yarn

    > npm install -g yarn
    
  3. 安装 nrm nrm 作用是修改 npm 的镜像源 安装 nrm

    > npm install -g nrm
    

    设置 npm 源为私服地址:

    > nrm add me http://*.*.*.*:78900
    > nrm use me
    
  4. 建议 IDE vscode

  5. vscode必装插件 ESLint

    Prettier - Code formatter

    通过这两个插件,配合项目中的规则配置文件,可以使团队中的代码格式化规则一致

安装 create-bff-service-cli

> npm install -g create-bff-service-cli

安装之后就可以使用 cli 命令: create-bff-service

cli 执行命令说明

在命令行执行命令

create-bff-service init

然后会出现交互提示,按照交互提示输入各项参数。

参数项说明
  1. 服务名称 serviceName: 服务的英文名称,例如: xxx-bff-service
  2. 作者 author: 作者的英文名称,例如:xiaoming
  3. 服务端口号 port: 找运维申请的服务端口号,例如:7001
  4. 版本号 version: 服务的版本号,例如:0.0.1
  5. 介绍 description: 服务的介绍 例如:某业务线的 BFF 服务
  6. 模版 template: 选择模版 例如:选择 typescript 模版
  7. 项目版本管理 git: 选择是否 git 初始化项目 例如: yes git 初始化项目
  8. 项目依赖安装 install: 选择是否安装依赖 例如: yes install 所有依赖
使用调试模式启动 cli 创建的 bff-service
> yarn debug
模版接口测试

接口访问测试:调用 demo/demo1 路由,获取服务返回数据。

curl http://127.0.0.1:7890/demo/demo1

// 返回结果
{"status":200,"data":{"r":"hello word"}}
模版代码保存自动格式化配置

该功能正常使用前提需要安装前文提到的 vscode 插件

代码已开源, 源码地址:

https://github.com/koala-coding/create-bff-service-cli

关于我 & Node交流群

大家好,我是 koala,一个有趣且乐于分享的人,目前专注完整的 Node.js 技术栈分享,工作中负责部门中台搭建以及低代码平台的一些能力。如果你对 Node.js 学习感兴趣的话(后续有计划也可以),可以关注我,加我微信【ikoala520】,拉你进交流群一起交流、学习、共建,或者关注我的公众号程序员成长指北。Github 博客开源项目 github.com/koala-codin…

  • 欢迎加我微信【 ikoala520 】,拉你 进 Node.js 高级进阶群,一起学Node,长期交流学习...