`Невозможно использовать e" __Schema"из другого модуля или области. 'И` Дублировать модули "graphql" с помощью ApolloClient
У меня есть приложение React с ApolloClient с Apollo-Link-Schema. Приложение работает нормально локально, но в нашей тестовой среде (с использованием GOCD) мы получаем следующую ошибку:
Uncaught Error: Cannot use e "__Schema" 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.
https://yarnpkg.com/en/docs/selective-version-resolutions
Duplicate "graphql" modules cannot be used at the same time since different
versions may have different capabilities and behavior. The data from one
version used in the function from another could produce confusing and
spurious results.
at t.a (instanceOf.mjs:21)
at C (definition.mjs:37)
at _ (definition.mjs:22)
at X (definition.mjs:284)
at J (definition.mjs:287)
at new Y (definition.mjs:252)
at Y (definition.mjs:254)
at Object.<anonymous> (introspection.mjs:459)
at u (NominationsApprovals.module.js:80)
at Object.<anonymous> (validate.mjs:1)
Зависимости устанавливаются с помощью пряжи, я добавил resolutions
в package.json.
"resolutions": {
"graphql": "^14.5.8"
},
Я проверил yarn.lock и нашел только одну ссылку на пакет graphql.npm ls graphql
не отображает дубликатов.
Я подумал, что, возможно, это проблема сборки с веб-пакетом - у меня есть другой сценарий сборки для постановки, но, запустив его локально, я все еще могу запустить приложение реакции с этим пакетом.
Может ли кто-нибудь предложить что-нибудь еще, чтобы помочь мне это исправить?
7 ответов
Мне удалось найти причину проблемы, если это кому-то поможет. Проблема вовсе не связана с повторяющимися экземплярами пакета, это ложное срабатывание, вызванное нами с помощью DefinePlugin webpack для установкиprocess.env.NODE_ENV
к staging
для нашей постановочной сборки.
Однако в webpack mode
(см. https://webpack.js.org/configuration/mode/), который устанавливает процесс.env.NODE_ENV, принимает толькоnone
, development
а также production
как допустимые значения. Это привело к сбою проверки env в пакете graphql и появлению этого сообщения об ошибке.
В нашем случае нам нужно различать промежуточную и производственную среду, поскольку конечная точка нашего API отличается в зависимости от этого, но реализованное нами решение не должно полагаться на process.env.NODE_ENV
, но чтобы назначить пользовательскую переменную при сборке (например, process.env.API_URL
)
Я оказался здесь, потому что использую AWS CDK и конструкцию NodejsFunction. Я также использовал связку с
minify: true
.
Переключение minify на false решило это для меня.
Я бы попробовал воспроизвести ошибку локально и отладить ее:
попробуй это:
rm -rf node_modules yarn.lock
# also remove any lock files if you have package-lock.json too
yarn install
# build the project locally and see if you got the error
Однажды у меня возникла эта проблема, когда я работал с Gatsby и двумя разными темами, в которых использовались разные версии GraphQL. Также более четко укажите версию (без символа вставки) и проверьте, сохраняется ли ошибка.
у вас есть репо? что тоже поможет нам помочь вам:)
У меня была эта проблема, поэтому я переключился на пряжу, и после удаления node_modules и файла блокировки npm, а затем запуска пряжи проблема исчезла :-).
У меня была аналогичная проблема при попытке запустить кодогенерацию Apollo, и я смог исправить ее, выполнив дедупликацию моих пакетов npm. Запустите это:
rm -rf node_modules && npm i && npm dedupe
- Добавьте ключ разрешения в файл package.json.
- Запустите установку и проверьте, где написано, что ваша версия Graphql отличается, например
warning Resolution field "graphql@14.3.0" is incompatible with requested version "graphql@^15.8.0"
. изменить тебя - Обновите свой пакет до противоречащего пакета.
Хотя переход к производственной среде может решить проблему, если у вас есть разные переменные для каждой среды и вы не хотите путаться с вашими метриками, это не идеальное решение.
Вы сказали, что используете webpack. Если сборка с проблемой использует какую-то карту источников в вашем инструменте разработки, вы можете отключить ее, чтобы увидеть, сохраняется ли проблема. Вот как я решил это, не задавая
NODE_ENV
к производству.