一、项目背景

1.1 痛点分析

大厂研发架构图如下所示:

image.png

在研发过程中,通常会存在以下痛点:

  • 创建项目/组件时,存在大量重复代码拷贝 => 快速复用已有沉淀
  • 协同开发时,由于git操作不规范,导致分支混乱,操作耗时 => 制作标准的git操作规范并集成到脚手架
  • 发布上线耗时,而且容易出现各种错误 => 制定标准的上线流程和规范,并集成到脚手架

1.2 需求分析

针对这些痛点,产生如下需求分析:

  • 通用的研发脚手架
  • 通用的项目/组件创建能力:
    • 模板支持定制,定制后能够快速生效;
    • 模板支持快速接入,极低的接入成本;
  • 通用的项目/组件发布能力:
    • 发布过程自动完成标准的git操作;
    • 发布成功后自动删除开发分支创建tag
    • 发布后自动完成云构建、OSS上传、CDN上传、域名绑定;
    • 发布过程支持测试/正式两种模式;

二、脚手架架构设计

脚手架架构设计图.png

架构图设计说明
资源体系
云发布产物会上传到 CDN 上。
注:前端静态资源只上传到 OSS 是不够的,因为 OSS 是无法实现资源加速的,需上传到 CDN 上才能实现加速。

远程缓存体系
主要功能是对云构建过程中的重要内容进行缓存。

  • 发布任务缓存(Redis):当多人同时创建了云构建任务,这个时候就需在 Redis 中创建任务队列。
  • 服务端缓存:云构建是无法保存构建产物的,故需将构建产物放至服务器端进行缓存。

本地缓存体系
脚手架的配置信息通常会存储在本地文件中,而一些重要信息则放置环境变量中。

模板库
项目模板和组件模板存储在 NPM 上。

数据体系
项目模板的相关信息(版本、地址等)会存储在 MongoDB 中,组件模板的相关信息会存储在 MySQL 数据库中。

注意事项

  • 大厂架构师很多时候不是边写边想,而是把整体和局部都想清楚了再开始做;
  • 注意培养自己的思考能力,将代码实现细节的内容抽象,通过系统论的思想构建复杂系统

三、脚手架拆包策略

整个脚手架项目是基于 Lerna 进行管理的,这里面就牵扯到脚手架拆包策略是怎样的,即脚手架的 package 应该有哪些?

目前脚手架的拆分策略是依据功能点进行拆分,拆分结果如下所示:

  • 核心流程(core):负责核心框架开发
  • 命令模块(commands):将所有命令全聚合到 Commands 目录
    • 初始化(核心命令)
    • 发布(核心命令)
    • 清除缓存(clear)
  • 模型层(models):存储很多重要信息
    • Command 命令
    • Project 项目
    • Component 组件
    • Npm 模块
    • Git 仓库
  • 工具模块(utils):工具方法
    • Git 操作
    • 云构建
    • 工具方法
    • API 请求
    • Git API

四、脚手架核心模块(Core)

脚手架核心模块(即core目录)包含三个功能点:

  • 执行准备(prepare)
  • 命令注册(register command)
  • 命令执行(execute command)

4.1 Core 模块技术方案图

脚手架核心模块(core).png

4.2 功能点:准备阶段

检查 Node 版本
检查 Node 版本意义在于在调用 Node 高版本 API 时,对于 Node 低版本会存在无法兼容问题。如果发现 Node版本不合适,则不应该允许用户进行升级。

检查 root 启动
检查用户是否是通过 sudo 方式进行启动的。通过 root 账户进行启动,会导致创建的文件后续无法进行维护,如无法删除文件。这是因为在操作系统中使用 root 账户创建的这些文件,其他用户是不能进行访问的。

因此若发现用户是通过 sudo 方法进行启动的,这个时候需要对用户进行降级,通过降级成普通用户避免后续造成一系列权限问题。

检查用户主目录
因为要往用户的主目录里写入缓存信息,所以需确保能拿到用户主目录。

检查环境变量
服务于本地缓存。