使用JavaScript的单一代码库:面向初学者的代码组织指南
随着项目的增长以及需要在应用程序不同部分复用的通用逻辑的出现,开发者会面临代码组织的问题。许多人开始复制文件、创建独立的npm包或混乱的模块。这个问题的解决方案是单一代码库(monorepo)。在本文中,我们将探讨什么是单一代码库,为什么它在JavaScript(Node.js)生态系统中是必要的,以及如何使用流行工具进行配置。本文面向已经熟悉Node.js和npm基础的初学者开发者。
什么是单一代码库,为什么需要它?
单一代码库是一种代码组织方法,所有项目、库和服务都存储在一个仓库中(例如,在GitHub上)。与每个项目都有自己的仓库的多仓库(multirepo)不同,单一代码库将所有内容集中在一个地方。
主要优势:
- 统一的版本控制:更容易管理影响多个包的变更。
- 代码复用:通用工具、类型和配置就在附近,无需发布到npm。
- 简化重构:一个包中的变更会自动与其他包一起测试。
- 统一的构建和测试:可以通过一条命令运行所有包的测试。
然而,单一代码库也有缺点:它可能变得过于庞大,依赖管理也可能变得复杂。为了解决这些问题,有专门的工具可用。
JavaScript中用于单一代码库的工具
在Node.js生态系统中,有几种流行的工具用于管理单一代码库。我们将介绍两种最常见的:NPM Workspaces(内置于npm中)和Lerna。
NPM Workspaces
从npm 7版本开始,通过workspaces内置了对单一代码库的支持。这是一种简单轻便的组织代码的方式,无需安装额外的包。
配置时,只需创建一个根package.json文件,并在其中指定包含包的文件夹:
// package.json (根目录){ "name": "my-monorepo", "private": true, "workspaces": [ "packages/*" ]}然后创建文件夹结构:
my-monorepo/├── package.json├── packages/│ ├── utils/│ │ ├── package.json│ │ └── index.js│ └── app/│ ├── package.json│ └── index.js现在,如果app包依赖于utils,您只需在依赖项中指定它:
// packages/app/package.json{ "name": "@my/app", "dependencies": { "@my/utils": "*" }}在项目根目录执行npm install后,npm会在包之间创建符号链接。这意味着您可以同时开发两个包,并且utils中的更改将立即可用于app。
Lerna
Lerna是一个更强大的工具,通常与NPM Workspaces或Yarn Workspaces一起使用。它增加了包发布、版本管理以及在所有包中执行命令的功能。
安装Lerna:
npm install -g lerna创建配置:
lerna init这将创建lerna.json文件和基本结构。配置示例:
// lerna.json{ "version": "0.0.0", "packages": ["packages/*"], "npmClient": "npm"}Lerna允许在所有包中运行命令:
lerna run testlerna run build以及管理包的版本