什么是 javascript monorepo 的正确方法

use*_*783 5 javascript npm webpack lerna monorepo

我正在尝试找出 javascript monorepo 的正确方法。想象一下包含包/库的 monorepo:

root
  - node_modules
  - packages
      + lib-a
          * node_modules
      + lib-b
          * node_modules
Run Code Online (Sandbox Code Playgroud)

现在让我们说lib-alib-b包都webpack用作它们的构建工具。

我看到两种方法

  1. 添加wepback为 root 的依赖项。在两个包中都包含“构建”脚本:"build": "webpack -p --config webpack.config.js. webpack.config.js可以包括 root webpack.config.js。然后我可以使用类似工具lerna从根目录运行构建(这意味着webpack可以识别二进制文件。但是我将无法在特定包中运行构建,因为webpack在那里不可用。我可能可以将构建脚本更改为类似"build": "../../node_modules/.bin/webpack -p --config webpack.config.js

  2. 始终包含webpack在每个包中。这意味着build脚本将成功。这也意味着每个包将具有相同的依赖项,我可能应该注意每个包使用相同的webpack版本。

基本上我得到的是 monorepo 中的包应该如何构建?如果发布了任何包,是否总是可以build单独发布该包。

Jac*_*k J 4

你的方法#2是正确的。您可以单独处理每个包,因为它是一个独立的、独立的包。

monorepo 的优点不在于通过目录结构共享文件,而在于:

  1. 将所有依赖项引导到具有扁平结构的单个依赖项node_modules,从而有效地删除它们的重复项。
  2. import通过常规包/使您的包可供其他包使用require(),因为它们是外部依赖项。而且,由于 的符号链接node_modules,您的“依赖项”包始终包含最新内容而无需发布。
  3. 在所有包中强制执行一致的、始终最新的依赖结构。正如您所说“这也意味着每个包都将具有相同的依赖项”。
  4. 自动化工具可使用单个命令对所有包执行不同的维护任务(例如构建、发布)。

我知道一开始并不那么容易,但是当您深入研究 Lerna 文档时,它会变得更加清晰。除了 Lerna主页之外,我还建议您阅读有关提升常见问题解答以及引导程序发布等单独命令的内容。