使用JavaScript的单一代码库:代码组织与最佳实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript 单体仓库:代码组织与最佳实践



现代 JavaScript (Node.js) 开发在处理大型项目时经常面临代码管理问题。当微服务、库和应用程序数量增长时,传统的多模块仓库 (Polyrepo) 开始造成混乱:配置重复、版本同步困难以及 CI/CD 流程冗长。解决方案是 单体仓库 (monorepo)。本文将探讨如何在 JavaScript 中组织单体仓库代码、使用哪些工具以及如何避免常见错误。



什么是单体仓库以及为什么需要它?



单体仓库是一种将所有项目代码(多个应用程序、库、服务)存储在一个仓库中的方法。与每个组件独立存在于各自 Git 仓库的 Polyrepo 不同,monorepo 将所有内容整合到一个统一结构中。



JavaScript 单体仓库的优势:

  • 统一的依赖版本 — 所有包使用相同版本的库,从而消除冲突。
  • 代码复用 — 通用工具和组件可以在子项目之间轻松导入,无需发布到 npm。
  • 原子提交 — 可以在一次提交中更改多个包,简化代码审查和回滚。
  • 简化的 CI/CD — 整个项目使用单一流水线,构建和测试可缓存。


然而,单体仓库也有缺点:它要求严格的代码组织纪律和正确的工具选择。接下来,我们将探讨如何组织结构以及使用哪些工具。



Node.js 单体仓库管理工具



JavaScript 生态系统提供了几种成熟的 monorepo 工具。我们来看看最流行的三种:



1. Lerna

经典工具,长期以来一直是标准。Lerna 管理包的发布、版本控制以及在所有包中运行脚本。示例 lerna.json 配置:

{  "version": "independent",  "packages": ["packages/*"],  "npmClient": "yarn"}

lerna bootstrap 命令为所有包安装依赖并将它们链接在一起。



2. Nx (Nrwl)

更现代、更强大的工具,具有高级缓存系统、依赖关系图和代码生成器。Nx 不仅支持 JavaScript,还支持 TypeScript、Angular、React、Next.js。创建库的示例命令:

npx nx generate @nrwl/node:library my-lib --directory=shared

Nx 自动分析依赖关系并仅重建更改过的包。



3. Turborepo

由 Vercel 创建,Turborepo 专注于构建速度和简单性。它使用智能缓存和并行任务执行。示例 turbo.json:

{  "pipeline": {    "build": {      "dependsOn": ["^build"],      "outputs": ["dist/**"]    },    "test": {      "dependsOn": ["build"],      "outputs": []    }  }}

Turborepo 非常适合包含大量包且 CI 速度至关重要的项目。



单体仓库中的项目结构组织



正确的文件夹结构是成功 monorepo 的基础。我们来看一个典型的 Node.js 项目结构:



my-monorepo/├── packages/│   ├── shared-utils/       # 通用工具│   │   ├── src/│   │   │   └── index.js│   │   └── package.json│   ├── api-gateway/        # API 网关│   │   ├── src/│   │   │   └── server.js│   │   └── package.json│   └── web-app/            # Web 应用程序 (React/Vue)│       ├── src/│       │   └── App.js│       └── package.json├── tools/                  # 脚本和配置                

博客

书籍推荐