Yarn link:将 graphql-js 项目导入另一个 graphql-js 项目显示另一个模块或领域错误

Yarn link: Importing graphql-js project into another graphql-js project showing another module or realm error

我使用 graphql-js 而不是 SDL 来设计我的 graphql 服务器。为此,我创建了一个依赖于 graphql-js 的小型库。

因此,我正在 link 使用 yarn (yarn add link:../lib) 将此库添加到我的主要项目中以构建 graphql 对象和模式。

我的 package.json 文件如下

graphql-lib/package.json

{
"name": "graphql-lib",
"private": true,
"version": "0.1.0",
"description": "",
"main": "index.ts",
"dependencies": {
    "graphql-iso-date": "^3.6.1"
},
"devDependencies": {
    "@types/graphql-iso-date": "^3.4.0",
    "@types/jest": "^25.2.3",
    "@types/node": "^14.0.5",
    "jest": "^26.0.1",
    "ts-jest": "^26.1.0",
    "typescript": "^3.9.3"
},
"peerDependencies": {
    "graphql": "^15.1.0"
}
}

core/package.json

{
"name": "@core/schema",
"private": true,
"version": "0.1.0",
"description": "",
"main": "index.js",
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
    "graphql-lib": "link:../lib",
    "graphql": "^15.1.0",
    "graphql-iso-date": "^3.6.1"
},
"devDependencies": {
    "@types/graphql-iso-date": "^3.4.0",
    "@types/jest": "^26.0.0"
}
}

使用 ts-jest 的 graphql-lib 测试工作正常。

但是,当我测试我的主要项目时,出现以下错误 -

Cannot use GraphQLScalarType "Float" from another module or realm.

Ensure that there is only one instance of "graphql" in the node_modules
directory. If different versions of "graphql" are the dependencies of other 
relied on modules, use "resolutions" to ensure only one version is installed.

node_modules 目录中的 graphql 模块仅包含 graphql-js 版本 15.1.0。我已经删除并重新安装了两个软件包中的 node_modules。

我的理解是应该有单一的graphql执行实例。我是否遗漏了在两个项目中都创建了 graphql 实例的东西?我可以 link 我的项目使用 yarn 并维护单个 graphql 实例吗?

只有当您的依赖项中有多个 graphql-js 副本时才会出现该错误。最常见的原因是您的 node_modules 中有多个版本。您可以通过 运行ning npm ls graphqlyarn ls graphql 验证情况是否如此——如果您看到依赖项中列出了多个版本,那就是一个问题。通常,这仅在您具有直接依赖于 graphql-js 的依赖项(而不是使其成为对等依赖项)时才会发生。如果你使用 yarn,你可以使用它 selective dependency feature 来解决这个问题。

当您在本地开发多个包时,您也可以 运行 解决这个问题,因为您有两个不同的副本 graphql-js -- 在您的两个项目中各有一个。发生这种情况是因为 npm linkyarn add link 仅创建一个从您项目的 node_modules 到另一个项目的符号 link。作为解决方法,您也可以 link graphql-js。进入项目 A 内的 node_modules/graphql 和 运行 npm link/yarn link。然后进入项目B的根目录和运行 npm link graphql/yarn link graphql。现在项目 B 将使用项目 A 的库副本而不是它自己的。