网站搜索

webpack - 如何在不经过构建周期的情况下,设置具有多级依赖图的 Typescript 单体仓库?


我有一个 TypeScript 单一仓库,包含以下 3 个包:

  • 套餐 A: 一个使用了套餐 B 和 C 的 React 单页面应用程序。
  • 套餐 B:一个 UI 库,它使用套餐 C。
  • 套餐 C: 一个带有第三方依赖的实用程序包。

我的目标是在开发过程中避免在每次依赖项更改后进行构建循环,因此我希望能够直接使用 B 和 C 包的 TypeScript 源代码,并可能享受 HMR(热重载)。

今天真是漫长的一天。

如果你想避免阅读我到目前为止各种尝试的描述,可以直接跳到最后两段,直接看问题。

我的一天从在 tsconfig.json 中定义 paths 字段开始:

{
  "compilerOptions": {
    ...,
    "baseUrl": "../",
    "paths": {
      "@package-b": ["path-to-package-b"],
      "@package-c": ["path-to-package-c"]
    }
  },
}

我很快意识到我必须放弃 create-react-app,因为它不支持路径别名。尝试使用不同的 CRA 重写技术导致了可怕的无效钩子调用,这意味着 react 无法解析不同版本的 react-dom。调整 noHoist 并没有帮助解决问题,按照文档建议的符号链接也无济于事。

总结随后进行的尝试:

  • 我尝试过使用 yalc。看起来在与 create-react-app 一起使用时,它仍然需要一个构建周期,因为 CRA 不会编译依赖项。
  • 我尝试过自定义的 webpack 构建,但没有成功让它工作。我确实花了很多时间让资源加载器识别我的图片。
  • 我尝试了 snowpack。使用一个名为 @fluentui/react 的第三方时遇到了问题,它无法编译,并让我看到一个未解决的问题。我意识到我必须分叉并调查它才能继续,于是决定放弃。
  • 我甚至研究过使用 bindfs 对目录进行硬链接,但似乎你需要 macFuse 才能实现,而它在安装过程中需要大量系统扩展权限。
  • 我目前正在尝试 Vite,它就像 snowpack 一样,也支持 原生 ES 模块,当你想要避免构建周期时,这一点很有前景。

我正在寻找一种解决方案,用于在不使用文件系统监听且不经过构建周期的情况下,为一个根 SPA 包和多个相互依赖的 TypeScript 包运行开发环境,并可以使用任意打包器。

在将此问题标记为"主要基于观点"之前,请注意,一个好的答案可以帮助未来的读者避免我今天经历的反复尝试。甚至这可以通过任何打包工具,利用这个或那个选项来完成在这方面也是一个好的答案。

相关文章