14.1. 企业级脚手架-monorepo+脚手架软连接使用

55 阅读5分钟

帮助开发者在开发过程中使用的开发工具,开发框架,使用脚手架无须从头开始搭建或者编写底层软件

1.脚手架需求评审

  • 创建项目

    • 初始化创建环境
    • 项目配置引导
    • 获取项目模板
    • 安装项目依赖
    • 完成项目创建
  • 打包项目

    • 检测打包环境(版本等信息)
    • 配置打包环境,例如使用rollup等
    • 打包
  • 监听模式启动项目

    • 启动项目可以实现热更新,实现代码lint等功能,类似于webpack的热更新
  • 项目代码检测

    • eslint代码检测和格式化以及代码压缩
  • 创建模块

    • 拉取模块
    • 替换模块占位信息
    • 生成新模块
  • 检测当前项目信息

    • 实现项目的环境检测,例如当前项目版本,依赖版本以及其他相关信息

2.脚手架方案设计

  • 技术选型
    • sade|| commander命令
    • inquire 命令行交互
    • chalk 为命令上色
    • ora 加载状态
    • semver 环境监测,依赖约束
    • execa 执行命令
    • np 包发布
    • fs-extra文件操作
  • 初始化脚手架项目
    • 创建node项目
    • 安装sade,编写一个hello命令,实现控制台输出"你好"
    • 发布到本地包
    • 使用这个脚手架
  • 定义一个项目横板
    • 准备模板
      • 本地定义
      • 远程模板
    • 选择模板
  • 打包与检测
  • 优秀开源项目脚手架源码赏析

脚手架的价值

  • 复用原则
  • DRY原则(DON't Repeat Yourself),软件设计原则和模式最本质的思想是消除重复
  • 开闭原则

初中级:
a. 熟悉脚手架需求:熟悉企业脚手架需求,能根据业务需要设计合适命令行工具
b. 基础架构与方案设计:掌握基于 monorepo 架构设计思想,掌握项目规范约束,掌握命令行工具架构细节
c. 了解命令行工具开发与调试方法:了解基于 monorepo 的设计开发模式,会本地调试命令行工具
高级:
a. 深入理解命令行工具需求与实现:深入理解命令行工具设计思路与实现方案
b. 掌握灵活命令行工具的架构思路:基于插件化思想封装设计命令行工具,命令、实现统一遵循插件协议

背景介绍

在企业级软件开发过程中,开发团队通常面临规范化、流程化和自动化的挑战。命令行工具能够有效解决这些问题,它的作用体现在以下几个方面:

1.规范化问题:

项目开发中,代码风格、目录结构、组件命名等方面容易因个人习惯而不一致,导致项目的整体质量下降,维护成本上升。 。规范化的需求不仅涉及代码层面,还包括项目构建、依赖管理、测试框架的使用等各个方面。

2.流程化问题:

大型项目通常涉及多个子系统或模块,开发流程复杂,人工操作容易出错或操作。

  • 在项目初始化、环境配置、依赖安装、测试、部署等流程中,如果没有统一的流程指导和工具辅助,容易出现流程混乱,效率低下的问题。
  • 自动化问题:
    随着项目复杂度的增加,手动处理日常开发中的重复性工作不仅耗时耗力,还容易引入人为错误。自动化工具能够帮助团队在开发、测试、构建、部署等环节减少重复劳动,提高工作效率,确保质量的一致性。

3.命令设计

命令行工具的设计需要围绕上述核心流程来构建,通常包含以下主要命令:

  • create:用于初始化新项目,生成基本的项目结构和必要的配置文件,
  • info:输出脚手架相关信息
  • serve:启动项目,在本地启动
  • build: 构建项目,生成可部署的生产环境代码
  • preview:本地启动一个服务,查看构建后产物加载效果
  • lint: 检查代码风格和质量,报告并修复不符合规范的代码
  • deploy: 部署项目到指定的环境中,如开发环境、测试环境、生产环境等
  • test: 运行测试用例,确保代码的正确性和健壮性

1. 初始化 pnpm Monorepo

  • 如何初始化一个 pnpm Monorepo 项目结构和基本配置。

    git init pnpm init

1.配置pnpm-workspace.yaml

这个配置文件定义了 Monorepo 的工作空间结构:

  • packages/*:用于存放可复用的库或工具包
  • apps/*:用于存放具体的应用程序
    这种结构允许在同一个仓库中管理多个相关的包,便于统一管理和依赖共享。
packages:
  - 'packages/*'
  - 'apps/*'

2. packages文件夹

在 packages 目录下创建三个核心项目:

  • cli/index.ts:命令行工具入口
  • core/index.ts:核心功能模块
  • shared/index.ts:共享工具模块

这种分离关注点的设计便于模块化开发和维护。

3.配置 cli 文件夹下 的 package.jsonbin/wzmserve

1. package.json

关键配置说明:

  • "type": "module":启用 ES Module 支持
  • "bin" 字段:定义全局命令 wzm-cli-demo,指向 bin/wzmserve 脚本
{
  "name": "@wzm/cli",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "type": "module",
  "bin": {
    "wzm-cli-demo": "bin/wzmserve"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "devDependencies":{
        "@wzm/cli-core":"workspace:*" // 当前项目下的npm包
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "packageManager": "pnpm@10.15.0"
}

2. bin/wzmserve

这是一个标准的 Node.js CLI 入口脚本:

  • #!/usr/bin/env node:声明,告诉系统用 Node.js 执行此脚本
  • 导入并执行 ../index.ts 主文件
  • 输出执行信息
#!/usr/bin/env node

// require("../index.ts");
import "../index.ts";
console.log("第一个脚手架执行命令");

3. 全局链接测试

通过 npm link 命令将 CLI 工具链接到全局环境,使得 wzm-cli-demo 命令可以在任何地方执行。执行结果展示了各模块的加载顺序和执行输出。

这个初始化过程为构建一个功能完整的 Monorepo CLI 工具奠定了基础架构,采用了现代化的模块化和包管理方案。
在 cli 文件夹下执行 npm link,软连接创建到全局,执行wzm-cli-demo