如何在配置了 TS 引用的 monorepo 上正确配置 Yarn 2 PnP?

Jap*_*r36 5 typescript yarnpkg-v3

简而言之:对于下面描述的项目,我如何才能最好地进行配置以使两个应用程序(客户端+服务器)运行?

我正在开发一个运行时间较长的项目,随着时间的推移,该项目演变成一个单一的存储库。我无法共享完整的代码,因为该项目是私有的,但该项目大致具有以下结构,并用数字标记,因此我可以在此示例中轻松引用特定文件:

<repo-root>/
1 个包.json
2 tsconfig.json
   客户/
3 包.json
4 tsconfig.json
     页数/
       索引.tsx
   全球的/
5 包.json
6 tsconfig.json
     源代码/
9 索引.ts
     建造/
       索引.js
       索引.d.ts
   服务器/
7 包.json
8 tsconfig.json
     源代码/
       索引.ts
     垃圾桶/
       索引.js

具体来说,客户端包含一个NextJS项目,服务器包含一个NodeJS Express服务器,全局目录包含客户端和服务器都使用的一些共享功能和接口。

客户端和服务器能够通过 typescript 项目引用访问 global,以及使用 typescript 别名映射@global/到客户端上的 global/src 目录以及服务器上的 global/build 目录,如 tsconfig 文件中所示以下。之所以在global中有一个build目录,是因为我们在服务器中有一个编译环境;服务器应用程序的构建tsc和运行node server.js(大致)。以下是编号的文件,放入 Pastebin 中,这样帖子就不会很大:

  1. /package.json
  2. /tsconfig.json
  3. /客户端/package.json
  4. /客户端/tsconfig.json
  5. /global/package.json
  6. /global/tsconfig.json
  7. /服务器/package.json

8 是一个代码片段,因为我当天的访客粘贴用完了:

 <repo-root>/
1  package.json
2  tsconfig.json
   client/
3    package.json
4    tsconfig.json
     pages/
       index.tsx
   global/
5    package.json
6    tsconfig.json
     src/
9      index.ts
     build/
       index.js
       index.d.ts
   server/
7    package.json
8    tsconfig.json
     src/
       index.ts
     bin/
       index.js

这是我们可以做的最好的设置。然而,在我们的代码再次运行之前,还存在几个问题。

我们决定将 mono 存储库迁移到yarn pnp,因为在我在客户端和全局 ( ) 之间添加共享依赖项后,我们在运行时遇到了这个问题draft-js。github 评论中的链接媒体文章指出了几种可能的解决方案,但我们没有使用 lerna,我们的整个应用程序也没有使用 webpack(只有客户端,因为 NextJS 内部使用它)。所以我们的解决方案似乎在脚注中,yarn pnp。

然而,我找不到任何关于如何将项目引用从 ts 正确转换为纱线 PnP 依赖项的文档,或者至少如何使一切在纱线 pnp 环境中再次工作。

通过这种设置,我们首先遇到了全局无法构建的问题。它打印错误“找不到模块‘firebase’或其相应的类型声明”,即使 firebase 在文件 5 中明确列为依赖项,并且我可以在 .yarn/cache 目录中看到正确版本的 zip 文件火力基地。我还验证了它正在使用 .pnp.cjs 文件,并且我正在yarn build那里运行 ( yarn tsc --build),并yarn -v打印出我正在按预期使用 v3 canary 版本;我不明白为什么它仍然找不到 firebase 模块。

不过,在这个问题之后,另一个问题是打字稿别名似乎现在应该被替换为portal:link:依赖项,如其文档中所述。这对我们不起作用,在尝试专门构建服务器时它无法解决依赖关系。接下来,我们尝试使用工作区,因为这似乎也承诺允许客户端和服务器相互访问。这是您现在可以在粘贴中看到的配置。但是,现在当尝试使用此工作区配置编译全局时,我收到类似于此处第二个片段的错误,关于“无法定位 pnpapi”,表示 global/.pnp.cjs 受根 .pnp.cjs 控制

谁能告诉我,我怎样才能最好地建立这种项目?需要什么样的重构,以便我可以拥有一个存储库,其中包含 NextJS TS 客户端、NodeJS 服务器以及用于共享 TS 接口和一些函数的共享全局目录(因此还有一些共享依赖项来从中获取类型/函数,例如作为 Draft-js 和 firebase)?

如果我可以提供更具体的细节或更好地格式化这个问题,也请对此发表评论。

谢谢!