Typescript 项目引用:处理引用项目的第三方依赖项

2024-06-07

我有一个包含 3 个目录的项目client, api, and shared. The shared目录包含 typescript 类型和定义engine我想与之共享的文件夹client and api。此外,shared目录还需要一些第三方依赖项(在其 package.json 文件中指定)。

可以找到描述此场景的非常基本的示例存储库here https://github.com/priyath/typescript-shared-example/tree/project-references,在分支下project-references。本质上,server.js in api将导入并调用一个函数Entity.ts类又依赖于外部库(mathjs)。

现在我一直在尝试使用项目引用(相当不成功!)来构建我的api(我还没有研究过客户端!)以便共享代码可以在dist文件夹内的api用来。

到目前为止我所做的:

  1. 我添加了以下内容tsconfig.build-api.json文件到shared目录。这outDir指向一个dist里面的文件夹api。这个想法是将编译后的共享文件移动到 api 的dist文件夹,保持相同的目录结构dist这样我的进口就不会损坏。同样,我计划为客户端提供另一个 tsconfig 文件。
{
  "compilerOptions": {
    "lib": ["es2015", "es2017", "dom"],
    "module": "commonjs",
    "target": "es6",
    "declaration": true,
    "declarationMap": true,
    "composite": true,
    "moduleResolution": "node",
    "outDir": "../api/dist/shared"
  },
  "include": ["engine"],
  "exclude": ["node_modules", "lib"],
  "references": []
}

  1. 我已经更新了 apitsconfig.json文件来引用共享目录的tsconfig.build-api.json file
{
  "compilerOptions": {
    // some options
    "outDir": "dist/api/src",
  },
  "references": [
    { "path": "../shared/tsconfig.build-api.json" }
  ],
  // some more options
}
  1. I run tsc --build .从里面api创建一个目录dist文件夹中包含已编译的 api 和共享代码。但是,当我尝试运行此构建代码时,我收到一条错误,指出shared找不到代码。

如何确保我引用的项目的第三方依赖项(shared)已解决,内部没有任何问题api?

注意:如果我的共享代码中没有第三方依赖项,我只需使用相对路径来执行所需的导入,就可以在没有项目引用的情况下完成所有这些工作。蒂乌被解释了here https://stackoverflow.com/questions/67031698/my-approach-to-share-typescript-code-between-cra-and-backend-am-i-missing-anyth。然而,由于外部依赖,我仍然无法找到一种方法来做到这一点。研究导致了诸如单一存储库、learana、yarn 工作空间等的出现。但我认为这可以在不依赖外部工具的情况下解决。


我必须解决同样的问题,经过几天的绞尽脑汁并使用我在网上可以找到的任何东西,这是我认为可以正常工作的唯一解决方案。它相当脆弱,因为它需要非常仔细平衡的文件夹结构才能工作。

我将使用客户端-服务器通用范式进行讨论,clientserver取决于common项目。让我们从最顶层的“解决方案”文件夹开始。

除了其他设置外,还需要tsconfig.json(以确保 TSC 构建两个依赖项目):

"references": [
  {
    "path": "./client"
  },
  {
    "path": "./server"
  },
 ]

And a package.jsonwith(以确保运行的代码能够加载公共模块):

"imports": {
  "#common/foobar": "./out/common/src/foobar.js"
},

这俩clientserver包需要一个tsconfigwith -- 确保它们输出到一个公共的out文件夹,以帮助 TS (IDE) 找到通用模块并在构建过程中依赖它:

"compilerOptions": {
  "baseUrl": ".",
  "rootDir": "../",
  "outDir": "../out",
  "paths": {
    "#common/*": [
      "../common/src/*.ts"
    ]
  },
},
"references": [
  {
    "path": "../common"
  }
],

这两个项目都可以使用并参考common在他们的源代码中为:

import { foobar } from '#common/foobar';

The common项目需要一个tsconfigwith (也可以输出到同一文件夹,并充当适当的TSC --build依赖项目):

"compilerOptions": {
  "baseUrl": ".",
  "rootDir": "../",
  "outDir": "../out",
  "composite": true,
  "declaration": true,
  "declarationMap": true,
},
"references": []

最终的结果是一个共同点out在项目最顶层的文件夹中,其中包含三个子项目的子文件夹。如果需要,您可以从那里继续打包。

我发现如果outDir or rootDir文件夹具有任何其他结构,即使来自官方文档,整个方案也会崩溃。要克服的最大障碍是我们需要源代码(IDE 中的编译器和分析工具)和最终的转译代码来解决common模块。虽然我们使用相同的#common/foobar在这两种情况下,两者都有不同的底层机制:工具链使用tsconfig.json当运行代码使用package.json。虽然第一个允许我们查看项目文件夹根目录之外的内容(使用../), 第二does not。这就是为什么我说你需要接受这一点out/*结构保持原样,并修改您的打包或运行需求以适应此文件夹结构,而不是相反:out三个子文件夹都可以工作,而三个子文件夹每个都有其out将不会。

最后,不要忘记在构建模式下调用 TSC:

"scripts": {
  "compile": "tsc -b",

外部依赖是根据具体情况而定,每个子项目都需要自己的依赖,最顶层的依赖package.json还需要其中的相关包node_modules.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 项目引用:处理引用项目的第三方依赖项 的相关文章

随机推荐

  • 如何在android上使用离线包来反应本机项目?

    如何在 Android 上使用离线捆绑包 我没有看到关于在 android 上使用离线捆绑包的文档 我尝试取消注释 build gradle 中的代码 project ext react the name of the generated
  • Three.js、自定义着色器和具有透明度的 png 纹理

    我有一个非常简单的 PNG 纹理 一个带有透明背景的灰色圆圈 我用它作为制服map for a THREE ShaderMaterial var uniforms THREE UniformsUtils merge basicShader
  • 如何在 Netbeans 9 中打开 Grails 3.3 应用程序?

    我无法找到在 Mac 上的 netbeans 9 中打开 grails 3 3 8 项目的方法 我找到了几篇文章 见下文 但没有一个起作用 This one https grails org wiki version NetBeans 20
  • Angular2 和 lodash...找不到名称

    Angular2 和 lodash 为什么有这么多戏剧性的事情 我的意思是真的 下面是我的安装方法 npm install save lodash npm install save types lodash UPDATE 我按照博客做了这个
  • 如何格式化 Pandas 中的日期列?

    我有一个数据框df看起来像这样 ID Date 0 1 2008 01 24 1 2 2007 02 17 格式为Date is Y m d 如何将日期格式化为 m d Y format 我尝试使用此语法 但它没有给出正确的格式 df Da
  • 如何在 Macbook M1 Silicon 上正确安装 CocoaPods

    我正在尝试在配备 M1 芯片的新 MacBook Pro 上安装 Cocoa Pods 从12月份开始就找到了一些解决方案 由于是二月份 这些解决方案可能有点过时了 我在 CocoaPods 网站上找不到任何说明 有人能帮我解决这件事吗 我
  • Matlab - 如果值包含xxx,则删除元胞数组中的行

    在 Matlab 中 如何删除包含变量字符串的元胞数组中的元胞 假设我的元胞数组是 C svnTrunk RadarLib radarlb utilities scatteredInterpolant m C svnTrunk RadarL
  • java中类级锁是如何实现的?

    我知道锁定概念与同步静态和非静态方法分别锁定类和实例 我无法理解的是 类级锁是如何实现的 我的意思是 类只是一个模板 没有物理意义 那么 当我们说类级锁定是通过同步静态方法来实现时 会发生什么呢 该类的所有对象是否都被锁定或被其他进程锁定
  • 更改从 xib 加载的 UITableViewHeaderFooterView 上的背景颜色表示使用 contentView.backgroundColor

    I m 从 xib 文件创建 UITableViewHeaderFooterView https stackoverflow com a 20073742 35690 几乎一切都工作正常 问题是 现在当我尝试更改背景颜色 或者如果我在 xi
  • 使用回退异步加载 jquery 核心

    通过标头中的性能优化和非阻塞脚本 我一直在尝试异步加载 jquery 本身 我遇到了一个jQuery 加载器 http www yterium net jQl an asynchronous jQuery Loader脚本 那个async加
  • 是否可以在 Objective-C 中创建自定义指令?

    Objective C 有如下指令 界面 执行 end 协议 财产 合成 我认为这些东西就像复杂的宏或代码生成器 是否可以创建用于代码生成目的的自定义指令 一种可能的用途是为 CoreData 生成方法 我想不是 因为我从来没有见过任何东西
  • 无法完成 Git Rebase

    我目前正在一个分支上工作 想用 master 来更新它 所以我尝试做一个变基 我正在处理的当前分支 crtdev 我尝试做变基 git checkout crtdev git rebase master used diff mergetoo
  • ios UICollectionView - 设置自动高度

    我正在使用 UICollection 视图创建 3x4 按钮矩阵 iPhone4很好看 高度也比较小 此外 集合视图不会滚动 因为它在可用空间中显示 3x4 矩阵按钮 现在 当我在 iPhone5 上运行相同的应用程序时 我看到底部按钮矩阵
  • 如何使用 jquery 验证这种格式 (yyyy-mm-dd) 的日期?

    我正在尝试验证以下格式的日期 yyyy mm dd 我找到了这个解决方案 但它的格式不符合我的需要 如 mm dd yyyy 这是该解决方案的链接 http jsfiddle net ravi1989 EywSP 848 http jsfi
  • 网守检疫问题与证书

    我们的应用程序已经过代码签名 我们的 Apple 证书是最新的 我们的应用程序的早期版本运行得很好 然而 当用户下载 DMG 时 在某些 Mac 上该应用程序会被隔离 但对于大多数用户而言 情况并非如此 因此 一些用户可以打开该应用程序 而
  • 在 PhoneGap 中启用数字键盘上的 Enter 键

    我们在 Android 3 22 上运行 PhoneGap 2 6 jquery mobile 和backbone 也在其中 我们希望用户在字段中输入值后可以点击回车键来提交表单 该字段是数字输入
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • 为什么 Boost.Asio 不支持基于事件的接口?

    我正在尝试理解 Boost Asio 目的是潜在地使用条件变量与 Boost Asio 结合来实现信号系统 我看过其他 StackOverflow 问题boost asio异步等待条件变量 https stackoverflow com q
  • 如何让 ipdb 在调试时显示更多行上下文?

    默认情况下 在 IPython 中调试期间 ipdb http pypi python org pypi ipdb显示代码中当前位置的上方一行和下方一行 有没有简单的方法可以让显示的区域更大一点 我认为它是可配置的 但一直无法找到它 您可以
  • Typescript 项目引用:处理引用项目的第三方依赖项

    我有一个包含 3 个目录的项目client api and shared The shared目录包含 typescript 类型和定义engine我想与之共享的文件夹client and api 此外 shared目录还需要一些第三方依赖