仓库
文档
共享代码

在单一仓库中共享代码

单一仓库允许您在应用程序之间无缝共享代码。为此,您将构建 **包** 来在应用程序之间共享代码。

什么是包?

在单一仓库中,“包” 这个词有两个含义。它可以指以下两种情况:

  1. 您从注册表下载到 node_modules 的一组文件,通过包管理器(如 npm)。
  2. 包含可跨应用程序共享的代码的工作区 - 通常按照惯例位于 /packages 中。

这种双重含义对于刚接触单一仓库的人来说可能非常令人困惑。您可能非常熟悉 包安装,但对 工作区 可能不太熟悉。

事实上,它们非常相似。包只是一段共享代码。区别在于,已安装的包 位于您的 node_modules 中,而本地包 位于工作区中 - 通常位于您的 /packages 文件夹中。

包的结构

每个包都包含一个 package.json。您可能已经熟悉使用它来管理应用程序中的依赖项和脚本。

但是,您可能以前没有注意到 nameexports 字段

{
  // The name of your package
  "name": "my-lib",
 
  // When this package is used, this file is what gets imported
  "exports": {
    ".": "./src/index.ts"
  },
}

这两个字段对于确定 **包在导入时如何表现** 非常重要。例如,如果 index.js 有一些导出

export const myFunc = () => {
  console.log("Hello!");
};

我们将此文件导入到我们的一个应用程序中

import { myFunc } from "my-lib";
 
myFunc(); // Hello!

那么我们就可以在应用程序中使用 my-lib 文件夹中的代码。

总之,**每个包都必须在它的 package.json 中声明 nameexports**。

package.json 中的包解析是一个非常复杂的话题,我们在这里无法详细介绍。根据包的导入方式,您的 package.json 中的其他字段可能会优先于 exports - 但在大多数情况下,您应该可以正常使用。

查看 Node.js 文档 (在新标签页中打开) 以获取指南。

下一步

我们将介绍两种类型的包 - **内部** 包和 **外部** 包

内部 仅供其所在的单一仓库内部使用。它们设置起来比较简单,如果您的项目是闭源的,它们将对您最有用。

外部 被捆绑并发送到包注册表。这对于设计系统、共享实用程序库或任何开源工作很有用。但是,它们在捆绑、版本控制和发布方面引入了更多复杂性。