您可以Lerna
用于此目的。只要您可以进行一些重构和额外的工作。
什么是勒纳?:
Lerna 是一种用于管理具有多个包的 JavaScript 项目的工具,如 Monorepos 中所见,如Babel
、react
、material-ui
等。Lerna 围绕使用 git 和 npm 管理多包存储库优化了工作流程。Lerna 还可以减少开发和构建环境中大量包副本的时间和空间需求——通常是将项目划分为许多单独的 NPM 包的缺点。有关详细信息,请参阅起重机文档。
https://github.com/lerna/lerna
Lerna 将如何解决最初的问题?:
您的包可以相互依赖,这意味着您可以将自己的babel
包放入您的 repo,并让其他包依赖于您的“自定义”Babel-Packages。您必须选择退出外部Babel
并将所需的 Babel-Packages 放入您自己的管理包文件夹中。如果你有不同的库需要不同的 Babel 版本,那将是很多工作。但是,如果版本都相同,您可以将 Babel 添加为您的 Custom-Babel-Package 的依赖项。小心不要在之后混合它们。
假设您有 2 个软件包:
packages/module1
packages/@babel-custom
在 Lerna 环境中,每个包都有自己的package.json
. 这允许我们添加
@babel-custom/core
到你的包的依赖项(在我们的例子中module1/package.json
要添加您的包裹:
# Install module-1 to module-2
lerna add @babel-custom --scope=module1
更多示例:https ://github.com/lerna/lerna/tree/main/commands/add#readme
您也可以像这样阻止安装依赖项:lerna bootstrap --hoist --nohoist=babel-*
.
摇树呢?:
将所有内容与 Lerna 链接在一起后,您可以将您的更改compilerOptions.paths
为以下内容:
"paths": {
"@babel-custom/core": ["./packages/@babel-custom/src"]
}
为了清楚起见,您可以使用通配符。如果您有多个子包并想分别引用它们,这很方便。
"paths": {
"@babel-custom/core/*": ["./packages/@babel-custom/src/*"]
}
有一篇关于此的文章:https
://rossbulat.medium.com/typescript-working-with-paths-packages-and-yarn-workspaces-6fbc7087b325 旁注:npm 和 yarn 都适用于此。
最后一步是准备你的packages/@babel-custom/index.js
:
export { default as BabelPackage} from './BabelPackage';
export * from './BabelPackage';
通过 Lerna 安装依赖项后,您可以像这样导入或要求它们:
packages/module1/index.js
:
// import syntax
import { BabelPackage } from '@babel-custom/core'; // named import, top level
import BabelPackage from '@babel-custom/core/BabelPackage'; // import, second level
// require syntax
const { BabelPackage } = require('@babel-custom/core');
const BabelPackage = require('@babel-custom/core/BabelPackage ');
如果您想了解有关优化 Bundle 的更多信息,可以阅读以下内容:https ://material-ui.com/guides/minimizing-bundle-size/
您可能想查看这个 Repo:https ://github.com/mui-org/material-ui在packages/babel-plugin-unwrap-createstyles
.