【问题标题】:Resolving TypeScript dependencies in yarn workspaces解决纱线工作区中的 TypeScript 依赖项
【发布时间】:2021-04-13 08:56:22
【问题描述】:

我目前正在尝试建立一个带有两个工作区的 React/TypeScript monorepo,@scope/project-lib 和 @scope/project-app。我有 @scope/project-app 的 package.json 在依赖项下导入 @scope/project-lib: "*"。我可以通过做来让它工作

import { MyComponent } from @scope/project-lib/build/components/MyComponent

但消费者会使用

import { MyComponent } from @scope/project-lib/components/MyComponent

在我发布它之后,显然我也想在工作区中以这种方式使用它。

我在我的 tsconfig 中为 project-app 引用了 project-lib 路径:

  "compilerOptions": {
    "paths": { "@scope/project-lib/*": ["../project-lib/build/*"] }
    // other config options
  }

我也将它导入到 project-app 的 package.json 中:

  "dependencies": {
    "@scope/project-lib": "*",
    "react": "^16.12.0",
    "react-dom": "^16.12.0"
  },

奇怪的是,省略路径的 /build/ 部分会显示此错误: Module not found: Error: Can't resolve '@scope/project-lib/components/MyComponent' in 'path/to/user/folder/scope/packages/project-app/src'

我不明白它为什么要在 src 中查找(或者我应该将所有内容都指向 src?但是它是如何即时构建 TS 和 JSX 的呢?)

【问题讨论】:

    标签: reactjs typescript yarnpkg package.json monorepo


    【解决方案1】:

    我也有一个带有约 50 多个包的 TypeScript + Lerna(带 Yarn 工作区)的 monorepo。

    它被配置为不使用 path 指令,因为 Yarn Workspaces 可以自动检测这些指令并符号链接到根 node_modules 文件夹中的包目录。这样,它将像任何 3rd 方包一样,并且将读取和使用 package.jsonmain/module 字段。

    图形化

    node_modules/
    -- @scope/ -> (this is automatically generated by yarn)
    ---- foo -> symlink /packages/foo
    ---- bar -> symlink /packages/bar
    
    packages/
    -- foo/
    ---- dist/ -> built by TypeScript
    ------ index.js
    ---- package.json -> contains "main": "dist/index.js"
    ---- index.ts
    ---- tsconfig.json
    -- bar/
    ---- package.json -> contains "@scope/foo" as dependency
    ---- index.ts -> contains "import {baz} from '@scope/foo'"
    ---- tsconfig.json
    
    package.json
    yarn.lock
    

    注意。包必须在类型检查之前至少构建一次,以确保它们的 dist 文件夹存在

    【讨论】:

    • 也许 package.json 中的“main”是问题所在。当 baz 被定义并从 index.ts 导出时,进行您建议的更改确实允许我执行import { baz } from '@scope/foo'。但我仍然有从其他目录导入的问题。你可以为“main”指定一个目录吗?
    • @Mogarrr 您不能为main 指定目录,但可以使用exports ;遗憾的是,到今天为止,TS 仍然不支持它。 4.3.0-beta 应该支持它,但它仍然坏了。我一直在寻找类似的方法,但仍然想知道什么是最好的。
    猜你喜欢
    • 2019-06-04
    • 2018-04-06
    • 1970-01-01
    • 2019-12-29
    • 2021-09-06
    • 2020-08-07
    • 2019-06-27
    • 2021-09-02
    • 2018-07-18
    相关资源
    最近更新 更多