网站搜索

适用于 pnpm 单仓库的可行设置,包含 TypeScript、Vite 和 Rollup


我使用 pnpm workspaces 构建了一个单仓库,但在让它运行时遇到了麻烦。它在前端使用 TypeScript 和 Vite,在后端微服务使用 Rollup。

这是设置:

package.json                            <== all dependencies reside here
tsconfig.json
pnpm-workspaces.yaml
- commonlib/
  package.json, tsconfig.json, rollup.config.js
  src/
    ...interfaces, types etc---
- serverlib/
  package.json, tsconfig.json, rollup.config.js
  src/
    ...modules for common server/microservice funtionality---
- weblib/
  package.json, tsconfig.json, vite.config.js
  src/
    ...react etc components & functions---
- servers/
    srv-gateway/
      package.json, tsconfig.json, rollup.config.js
      src/
        ...server code...
    ms-xxx/                             <== Multiple REST microservices
      package.json, tsconfig.json, rollup.config.js
      src/
        ...microservice code...
- webapps/
    app/
      package.json, tsconfig.json, vite.config.js
      src/
        ...main application code---
    admin/
      package.json, tsconfig.json, vite.config.js
      src/
        ...application code---
    app-2/                              <== Other webapps / micro frontends
      ...

我的要求:

  • 我将所有包的依赖保存在根 package.json 文件中
  • 我想访问我的模块,比如 @myapp/commonlib、@myapp/weblib、...
  • 我不打算将这些发布到 npmjs(它们不是通用的——所以我不想为这些库使用语义化版本控制)
  • 我想要最高版本的依赖(我每天都会更新它们)。我还想在每个依赖上有多种类型,cjs、es、esm 等,这可能是我出错的地方。

我的问题:

  • 我在 package.json、tsconfig.json、rollup.config.json 和 vite.config.json 的定义中迷失了——它变得太复杂了。
  • 我需要编译/转译这个 *lib 并进行版本管理,还是只是以某种方式包含它们?
  • 包含如何?作为依赖(@myapp/...)?在实际的服务器/网络应用中使用“path”和“references”?如果是这样,我需要对这些*库进行 vite/rollup 打包吗?
  • 例如,在 weblib 中,我在编译时排除了所有外部包(vite.config.ts -> rollupOptions -> external),但现在我无法让 webapp 正常工作(空白屏幕)。

我之前有一个可用的系统,我定义了 @myapp/uilib、@myapp/graphlib 等,并使用了“path”和“references”。但随着它们数量的增加,我想把它们合并成一个单独的库。就在这里我迷失了方向。我做了太多的更改,无法从之前的 git 状态恢复。责任在于我看过的许多相互矛盾的教程和 ChatGPT,当然主要还是我自己 :/

显然我做得全错了,现在我想学正确的方法。

提前感谢您的帮助。

答案#1

经过漫长的试验、挣扎和性能测试之后,我决定选择这些:

  • 在 monorepo 的根目录下放置依赖是一个不好的主意。每当我到达 Docker 创建阶段时,我不得不将依赖移动到各自的包中。包管理器(pnpm)已经将它们保存在最高级别,并从各个包中链接它们。
  • 由于我正在使用微服务,每个服务在重构后都变得很小。因此,打包阶段变得不再必要,我放弃了服务器端的 rollup,转而使用 esbuild。它提供了良好、优化的 esm(目前为 ES2020)包,并且遵循 tsconfig.json 中的“references”。(tsup 还不支持,我尝试过并删除了它)
  • 由于前一点的原因,我将静态文件移出了打包生成(我之前有一些静态数据文件/JSON,是通过 express-static 提供的)。我将数据移到了 static.mydomain.com 安装中,因此我已经摆脱了构建期间的长时间复制过程。
  • 我目前在 React 前端应用中保留 vite/rollup 配置,它们运行良好——除了 Vite 在开发模式下启动非常慢的问题。
  • 在所有常用的、前端和服务器库中,我再次使用了 esbuild 包(仅 ES2020)。
  • 我还将所有最终的前端和服务器移动到“apps”,并将库移动到“libs”目录。
  • 我一直在使用多层级的 tsconfig.json 结构。

这是我在第一个单仓库中学到的一课。我会尝试更新这篇文章,说明我的结构。

相关文章