多包管理

1. Lerna

当模块非常多时, 你该如何管理你的模块呢?

  1. 每个模块都建立独立的仓库
    1. 虽然看起来干净,但模块多时, 依赖安装,不同版本兼容等,会导致模 块间依赖混乱,出现非常多的重复依赖, 极其容易造成版本问题。
  2. 所有模块都放到 1 个仓库里
    1. 显得更加有效,对于测试,代码管理,发 布等,都可以做到更好的支持。Lerna 就是基于这种初衷而产生的 专门用于管理 Node.js 多模块的工具, 当然,前提是你有很多模块需要管理。你可以通过 npm 全局模块来安装 Lerna,官方推荐直接使用 Lerna 2.x 版本。

最近又开始更新了。

命令

## 初始化
lerna init

## 发布
lerna publish

2. Pnpm Workspace

优点?

  1. 全局统一依赖。
  2. 解决幽灵依赖的问题。
  3. workspace

3. yarn workspaces

优点:

  1. 依赖安装在根目录

缺点:

  1. 不能并行执行

Npm 的问题

  1. 包管理,平铺的方式解决了长路径的问题。package 依赖不直观,所有 package 都是平级的,无法看出来谁依赖了谁;
  2. 项目中可以直接 import 间接依赖的 package
  3. 重复下载,耗费磁盘空间

Pnpm 原理

  1. 硬链接对文件做寻址。减少重复下载。
  2. 软链接对文件夹做寻址。

Pnpm 优势

节省磁盘空间

使用 npm 时,依赖每次被不同的项目使用,都会重复安装一次。 而在使用 pnpm 时,依赖会被存储在内容可寻址的存储中。所有文件都会存储在硬盘上的某一位置。 当软件包被被安装时,包里的文件会硬链接到这一位置,而不会占用额外的磁盘空间。 这允许你跨项目地共享同一版本的依赖。

提高安装速度

pnpm 分三个阶段执行安装:

  1. 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。
  2. 目录结构计算。 node_modules 目录结构是根据依赖计算出来的。
  3. 链接依赖项。 所有以前安装过的依赖项都会直接从仓库中获取并链接到 node_modules。

这种方法比传统的三阶段安装过程(解析、获取和将所有依赖项写入 node_modules)快得多。

创建一个非扁平的 node_modules 目录

使用 npm 或 Yarn Classic 安装依赖项时,所有的包都被提升到模块目录的根目录。 这样就导致了一个问题,源码可以直接访问和修改依赖,而不是作为只读的项目依赖。

默认情况下,pnpm 使用符号链接将项目的直接依赖项添加到模块目录的根目录中。

Last Updated:
Contributors: yiliang114