目录

  1. 脚手架
  2. 全局命令
  3. 交互式输入
  4. 拉取远程仓库代码
  5. 优化
  6. 总结

1、脚手架

今天工地的砖有点烫,我抬头望了望天,思考了半分钟,决定为了以后搬砖方便,先搭个脚手架:

不好意思,拿错了,是这个:

相信很多小伙伴都用过vue-cli、create-react-app或angular-cli之类的脚手架,一个命令行就能快速搭起项目框架,告别刀耕火种的复制粘贴,分分钟解放生产力。

作为一个有追求的切图仔,这种摸鱼神器,必须立马安排。

好了,那么问题来了:什么是脚手架?

从表现形式上来看,脚手架主要有以下几个特点:

  1. 一个能全局执行的命令;
  2. 能实现交互式输入,比如输入项目名称,选择配置项等;
  3. 能自动拉取github或gitlab远程仓库的代码。

当然高级的脚手架肯定不止这么点功能,不过我们先从最简单的实现起。

2、全局命令

2.1 基本原理

先拆包观察一下,类似vue-cli这类的全局命令是如何实现的。
首先找到vue-cli的安装路径,全局安装可以通过npm config get prefix找到路径,比如我的windows系统就是
C:\Users\用户名\AppData\Roaming\npm:

可以看到这个目录下有很多与全局命令同名的文件,以及一个node_modules文件夹。我们全局安装的依赖包就在node_modules里。找到@vue\cli,这个就是vue-cli的源码包。

vue-cli源码包中的package.json有这样一个关键配置:

  "bin": {"vue": "bin/vue.js"},

这个bin/vue.js脚本必须以#!/usr/bin/env node开头,

当npm全局安装时,就会根据这个配置,生成对应的同名可执行文件。

而当我们运行vue时,系统就会以node程序来运行vue.js。

npm官方文档中提供了npm link命令,用以让用户将自定义的脚手架生成一个全局命令。

npm link主要做了两步操作:

  • 一是在npm全局安装路径下的node_modules文件夹里生成一个链接文件,这个链接文件指向执行该命令的文件夹,也就是我们的脚手架源码文件夹;
  • 二是在npm全局安装路径下生成与配置bin里同名的可执行文件。

所以,通过npm link,我们就可以生成一个node全局命令

npm link官方文档:https://docs.npmjs.com/cli/v6/commands/npm-link。

2.2 全局命令的实现

话不多说,先来撸一个全局命令。

1)执行npm init初始化一个package.json

2)在package.json里加上bin配置:

  "bin": {"test-cli": "./test.js"},

3)添加对应的执行脚本文件test.js

#! /usr/bin/env node
console.log("Hello! My CLI!");

4)在package.json同级目录下执行npm link

5)在控制台运行一下我们定义的全局命令test-cli,看到输出结果:

完成!

3、交互式输入

通过上述操作,用户已经可以通过全局命令执行到我们的test.js文件,剩下的功能我们就可以在js里去自由发挥了。

Node社区有着数量庞大的第三方模块,藉由这些模块我们可以快速开发实现想要的功能。

inquirier就是其中之一,目前在github上有14.5k的star,它的目标就是“致力于成为一个易于嵌入且美观的命令行工具”。顾名思义,通过inquirier模块,我们可以在命令行中实现与用户的输入交互。

我们需要知道用户要创建的项目名称是什么,以及用户想要下载哪个远程仓库的代码:

const inquirer = require("inquirer");inquirer.prompt([{type: "input",name: "project",message: "项目名称",},{type: "list",name: "tpl",message: "请选择模板",choices: ["vue", "react"],}]).then((res) => {console.log(res);const { project, tpl } = res;// project就是用户输入的项目名称// tpl就是用户选择的模板});

这段代码就是为用户提供了一个input输入选项,来输入项目名称,以及一个list列表选项,来选择要下载的模板(之后我们再根据这个模板名称去对应的仓库地址进行下载)。

inquirer还有更多的选项功能,感兴趣的小伙伴可以去官方文档上自由探索:https://github.com/SBoudrias/Inquirer.js。

4、拉取远程仓库代码

现在我们已经知道用户要下载的是哪个模板代码,也知道这些模板代码对应的下载地址:

const stores = [{name: "vue",url: "https://github.com/vuejs/vue.git"},{name: "react",url: "https://github.com/facebook/react.git"}
]

拉取github或者gitlab远程仓库代码的第三方模块也有好几个,我选用的是nodegit,这个项目在github上目前有4.9k的star,用起来也很简单:

const Git = require("nodegit");/** 克隆远程仓库代码 */
// url: 源码仓库地址; path: 要下载的目标路径; cb: 下载结束后的回调函数
const gitClone = (url, path, cb)=>{console.log("正在下载远程仓库代码...")console.log(url)Git.Clone(url, path).then(function(res) {console.log("下载完成")cb(true)}).catch(function(err) { console.log("下载失败"+err);cb(false) });
}

nodegit官网地址:
https://github.com/nodegit/nodegit

至此三个基本功能都已实现!

5、优化

深谙摸鱼之道的我想了想,觉得还能更进一步,比如下载完源码,再帮我自动安装下依赖包啦:

const process = require('child_process');/** 安装依赖包 */
const install = (path)=>{ // path是源码模板中package.json所在的路径console.log("正在安装依赖包...")const cmd = 'cd '+path+' && yarn';process.exec(cmd, function(error, stdout, stderr) {console.log(error);console.log(stdout);console.log(stderr);console.log("安装完成")});
}

之前看到很多脚手架出场都自带拉风的艺术字,作为一个有追求的切图仔,这个必须安排!
这个也是用到了一个第三方模块figlet(https://github.com/patorjk/figlet.js):

const figlet = require('figlet');
figlet('My CLI!', {horizontalLayout:"full"}, function(err, data) {if (err) {console.log('Something went wrong...');console.dir(err);return;}console.log(data)// do something...
});

很多脚手架还提供了参数配置、帮助信息等功能,这个大多是通过commander模块实现的(https://github.com/tj/commander.js,20.7k star),这里就不详细展开了,我在demo项目里也简单实现了下,确实很强大很好用。

Demo已开源:https://github.com/youzouzou/testcli

这个demo只是简单地实现了脚手架的基本功能,探索了一下几个node模块的用法,还有很多需要优化的点。进一步学习的最好办法就是去看那些成熟的脚手架源码,然后去模仿去实践,再结合实际情况,摸索出最适合自己团队的方案。

6、总结

工欲善其事,必先利其器。

实际上脚手架并不拘泥于上面的实现形式,凡是能提高效率的工具,在某种意义上都可以称之为脚手架。

模仿只是最初级的阶段,创新才是真正的开始。

手摸手教你搭个脚手架相关推荐

  1. 【万字长文】手摸手教你shell脚本编程

    [万字长文]手摸手教你shell脚本编程 我写这篇文章的目的 前段时间参加了联创团队的春令营, 为期半个多月的春令营做了三个项目, 其中有一个项目是关于shell的, 当时完全没接触过shell脚本编 ...

  2. 手摸手教你做动态壁纸

    手摸手教你做动态壁纸 Android · jeasonwong · 于 5 天前发布 · 最后由 xingstarx 于 2 天前回复 · 440 次阅读 项目地址:https://github.co ...

  3. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  4. 快应用之手摸手,跟我走(1)

    快应用发布快两周啦.这两天有空,就捣鼓了一个快应用.整体感觉来说,交互很流畅,基本功能和组件都有.上手也很快.希望官网推广能做好.好了,话不多说,先上 gitHub (传送门) gankQuick-快 ...

  5. 招聘行业颠覆者【伯小乐】| 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 作者微信:weihe2416 "伯小乐" 是 ...

  6. 短视频Gif快手-有点意思 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告.                                 ...

  7. IN-我的生活in记 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 引言 IN是一款基于女性和品牌的时尚品位分享移动端社区,以图片社 ...

  8. 玩美自由行体验报告 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 个人微信:Hm_VS_Zyf 玩美自由行app是一款在线境外旅行 ...

  9. 手摸手产品研究院 | 玲珑沙龙-一个可以“撕逼”的女性文化社区

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 1-玲珑沙龙? 什么是玲珑沙龙,那些人在玩玲珑沙龙,为什么会玩? ...

  10. 每天研究一个产品,阿德老师“手摸手”带你写产品分析报告 |

    作为一个产品经理,要高频地去把玩各种最新产品,所以我们想把那些对世界充满好奇心.勇于探索新鲜事物的产品经理都聚在一起.一起深入研究国内外最新/奇产品,一起发现有趣的事情,并把研究心得都整理成文章沉淀下 ...

最新文章

  1. php 获取企业号用户,微信企业号 获取用户信息(示例代码)
  2. [UVa1213]Sum of Different Primes(递推,01背包)
  3. Chrome浏览器如何不让它缓存?
  4. Silverlight 2 学习笔记之事件的重复绑定问题
  5. java 1.7的新特性_[Java]  JDK 1.7版本的 新特性
  6. k8s容器内的东西复制出来_容器 | Docker 如此之好,你为什么还要用k8s
  7. 收获,不止SQL优化——抓住SQL的本质--第九章
  8. xmodmap使用指南
  9. 地址随机化 linux,GOT覆盖和Linux地址随机化
  10. 删除StringBuilder的最后一个字符?
  11. Streams AQ: qmn coordinator waiting for slave to start等待事件
  12. homebrew osx下面最优秀的包管理工具
  13. 2008 r2 server sql 中文版补丁_sql server 2008 r2 sp4
  14. 【新书推荐】【2020】卫星通信(第三版)
  15. 主流影视网站8合一H5视频源码自动更新数据
  16. 自动驾驶路径规划算法学习-RRT算法及matlab实现
  17. 关于WZ指令的配网与烧写固件
  18. 编程程序 runtime error
  19. 原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP
  20. 深度学习论文: Rethink Dilated Convolution for Real-time Semantic Segmentation及其PyTorch实现

热门文章

  1. android找不到华为推送,Android 华为推送 android 10.0 获取不到token
  2. 一、ShenYu快速开始
  3. vue多级菜单的实现
  4. opencv:基于凹点匹配的重叠分割
  5. jeecgSpringboot的前端Vue项目出现npm 配置错误相关问题
  6. TCP Reassembly
  7. yolov5导出onnx用netron.app可视化搜索
  8. 浏览器打开后自动打开某个页面
  9. 胶囊神经网络模型简介_胶囊网络简介
  10. git squash 和 git rebase