2

简短:对于下面描述的项目,我怎样才能最好地配置东西以便两个应用程序(客户端+服务器)运行?

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

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

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

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

  1. /package.json
  2. /tsconfig.json
  3. /client/package.json
  4. /client/tsconfig.json
  5. /global/package.json
  6. /global/tsconfig.json
  7. /server/package.json

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

{
    "compilerOptions": {
        "module": "commonjs",
        "removeComments": true,
        "lib": ["es2015", "dom"],
        "sourceMap": true,
        "esModuleInterop": true,
        "target": "es5",
        "declaration": false,
        "forceConsistentCasingInFileNames": true,
        "isolatedModules": false,
        "strict": false,

        "noImplicitAny": false,
        "noImplicitThis": false,
        "baseUrl": "./src",
        "rootDir": "./src",
        "types": ["node", "jest"],
        "paths": {
            "global/*": ["../../global/build/*"]
        },
        "outDir": "bin",
        "plugins": [
            { "transform": "typescript-transform-paths" },

            { "transform": "typescript-transform-paths", "afterDeclarations": true }
        ]
    },
    "include": ["./src/**/*.ts"],
    "exclude": ["*.d.ts", "**/*.spec.ts", "../global/**/*.ts"],
    "references": [{ "path": "../global" }]
}

这是我们可以为设置做的最好的事情。但是,在我们的代码可以再次工作之前,还存在几个问题。

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

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

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

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

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

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

谢谢!

4

0 回答 0