在单一仓库中共享代码
单一仓库允许您在应用程序之间无缝共享代码。为此,您将构建 **包** 来在应用程序之间共享代码。
什么是包?
在单一仓库中,“包” 这个词有两个含义。它可以指以下两种情况:
- 您从注册表下载到
node_modules
的一组文件,通过包管理器(如npm
)。 - 包含可跨应用程序共享的代码的工作区 - 通常按照惯例位于
/packages
中。
这种双重含义对于刚接触单一仓库的人来说可能非常令人困惑。您可能非常熟悉 包安装,但对 工作区 可能不太熟悉。
事实上,它们非常相似。包只是一段共享代码。区别在于,已安装的包 位于您的 node_modules
中,而本地包 位于工作区中 - 通常位于您的 /packages
文件夹中。
包的结构
每个包都包含一个 package.json
。您可能已经熟悉使用它来管理应用程序中的依赖项和脚本。
但是,您可能以前没有注意到 name
和 exports
字段
{
// 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
中声明 name
和 exports
**。
在 package.json
中的包解析是一个非常复杂的话题,我们在这里无法详细介绍。根据包的导入方式,您的 package.json
中的其他字段可能会优先于 exports
- 但在大多数情况下,您应该可以正常使用。
查看 Node.js 文档 (在新标签页中打开) 以获取指南。
下一步
我们将介绍两种类型的包 - **内部** 包和 **外部** 包
内部 包 仅供其所在的单一仓库内部使用。它们设置起来比较简单,如果您的项目是闭源的,它们将对您最有用。
外部 包 被捆绑并发送到包注册表。这对于设计系统、共享实用程序库或任何开源工作很有用。但是,它们在捆绑、版本控制和发布方面引入了更多复杂性。