Как использовать AWS Amplify с Sapper?

Моя цель - использовать AWS Amplify в проекте Sapper.

Создание проекта Sapper с нуля (с использованием webpack), затем добавление AWS Amplify и его запуск в dev - это успех, но запуск его в производственной среде вызывает ошибку GraphQL в консоли (Неперехваченная ошибка: невозможно использовать e "__Schema" из другого модуль или область).

Исправление этой ошибки показывает другую (Uncaught ReferenceError: процесс не определен).

Решение состоит в том, чтобы обновить GraphQL с 0.13.0 до 14.0.0, к сожалению, GraphQL 0.13.0 является зависимостью API AWS Amplify.

Кто-нибудь знает, что можно сделать, чтобы заставить AWS Amplify работать с Sapper в производственной среде?

Ссылка на репо, содержащее исходные файлы, находится здесь: https://github.com/ehemmerlin/sapper-aws-amplify


(Прошу прощения за длинный пост, но я хочу быть откровенным)

Подробные инструкции

1 / Создайте проект Sapper с помощью webpack (https://sapper.svelte.dev).

npx degit "sveltejs/sapper-template#webpack" my-app
cd my-app
yarn install

2 / Добавить AWS Amplify (https://serverless-stack.com/chapters/configure-aws-amplify.html) и lodash

yarn add aws-amplify
yarn add lodash

3 / Настройте AWS Amplify (https://serverless-stack.com/chapters/configure-aws-amplify.html)

Создайте файл конфигурации src / config / aws.js, содержащий (измените значения на ваши, но работает как есть для целей этого сообщения):

export default {
  s3: {
    REGION: "YOUR_S3_UPLOADS_BUCKET_REGION",
    BUCKET: "YOUR_S3_UPLOADS_BUCKET_NAME"
  },
  apiGateway: {
    REGION: "YOUR_API_GATEWAY_REGION",
    URL: "YOUR_API_GATEWAY_URL"
  },
  cognito: {
    REGION: "YOUR_COGNITO_REGION",
    USER_POOL_ID: "YOUR_COGNITO_USER_POOL_ID",
    APP_CLIENT_ID: "YOUR_COGNITO_APP_CLIENT_ID",
    IDENTITY_POOL_ID: "YOUR_IDENTITY_POOL_ID"
  }
};

Добавьте следующий код к существующему коду в src / client.js:

import config from './config/aws';

Amplify.configure({
  Auth: {
    mandatorySignIn: true,
    region: config.cognito.REGION,
    userPoolId: config.cognito.USER_POOL_ID,
    identityPoolId: config.cognito.IDENTITY_POOL_ID,
    userPoolWebClientId: config.cognito.APP_CLIENT_ID
  },
  Storage: {
    region: config.s3.REGION,
    bucket: config.s3.BUCKET,
    identityPoolId: config.cognito.IDENTITY_POOL_ID
  },
  API: {
    endpoints: [
      {
        name: "notes",
        endpoint: config.apiGateway.URL,
        region: config.apiGateway.REGION
      },
    ]
  }
});

4 / Проверьте это

В dev (yarn run dev): работает

В производстве (сборка пряжи; узел __sapper __ / build): выдает ошибку.

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.

5 / Исправить

По указанной ссылке (https://yarnpkg.com/en/docs/selective-version-resolutions) Я добавил этот код в файл package.json:

  "resolutions": {
    "aws-amplify/**/graphql": "^0.13.0"
  }

6 / Проверьте это

rm -rf node_modules; yarn install

Выдает очередную ошибку в консоли (даже в режиме разработки).

Uncaught ReferenceError: process is not defined
at Module../node_modules/graphql/jsutils/instanceOf.mjs (instanceOf.mjs:3)
at \_\_webpack_require\_\_ (bootstrap:63)
at Module../node_modules/graphql/type/definition.mjs (definition.mjs:1)
at \_\_webpack_require\_\_ (bootstrap:63)
at Module../node_modules/graphql/type/validate.mjs (validate.mjs:1)
at \_\_webpack_require\_\_ (bootstrap:63)
at Module../node_modules/graphql/graphql.mjs (graphql.mjs:1)
at \_\_webpack_require\_\_ (bootstrap:63)
at Module../node_modules/graphql/index.mjs (main.js:52896)
at \_\_webpack_require\_\_ (bootstrap:63)

Исправление, данное этой веткой (https://github.com/graphql/graphql-js/issues/1536) заключается в обновлении GraphQL с 0.13.0 до 14.0.0, к сожалению, GraphQL 0.13.0 является зависимостью API AWS Amplify.


person Eric Hemmerlin    schedule 14.10.2019    source источник
comment
Во-первых, поздравляю с написанием такого хорошо задокументированного вопроса! Я рискну сделать здесь простое предложение: пробовали ли вы разветвлять @aws-amplify/api и обновлять его graphql зависимость до 14.x.x? Возможно, стоит попробовать в целях тестирования, посмотрите, не сломается ли что-нибудь еще. А если нет, и это решит вашу проблему, возможно, рассмотрите возможность подачи PR.   -  person Thomas Hennes    schedule 15.10.2019
comment
@Jaxx Спасибо! Да, я форк @ aws-ampify / api обновил его зависимость graphql до 14.5.8 в ветке dev репозитория github.com/ehemmerlin/sapper-aws-amplify/tree/dev, который работает в dev, но дает ту же неперехваченную ошибку: невозможно использовать e __Schema из другого модуля или области в производстве (после yarn запустить сборку; узел __sapper __ / build).   -  person Eric Hemmerlin    schedule 19.10.2019
comment
@Jaxx после отправки этой проблемы на aws-ampify / ampify-js запрос на вытягивание, обновляющий зависимость graphql до 14.x.x, был объединен с основной веткой. Это решает эту проблему. Спасибо, что указали на это. Я ценю вашу помощь!   -  person Eric Hemmerlin    schedule 23.10.2019
comment
Это отличные новости, Эрик! Пожалуйста, и благодарим вас за то, что сделали эту проблему очевидной, что привело к обновлению кода; это принесет пользу всем пользователям этого модуля!   -  person Thomas Hennes    schedule 23.10.2019


Ответы (1)


При создании моего проекта (я использую npm и webpack) я получил это предупреждение:

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults 
for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/

который, по-видимому, связан с ошибкой схемы, поскольку эти сообщения указывают на то, что самым быстрым исправлением ошибки является установка NODE_ENV на production в вашей среде (для mode установлено значение переменной среды NODE_ENV в конфигурации веб-пакета):

https://github.com/aws-amplify/amplify-js/issues/1445

https://github.com/aws-amplify/amplify-js/issues/3963

Как это сделать:

Как настроить NODE_ENV для производства / разработки в ОС X

Как установить NODE_ENV = production в Windows?

Или вы можете напрямую связываться с конфигурацией веб-пакета:

https://gist.github.com/jmannau/8039787e29190f751aa971b4a91a8901

К сожалению, некоторые сообщения в этих проблемах GitHub указывают на то, что изменение переменной среды может не работать для упакованного приложения, особенно на мобильных устройствах.

Эти сообщения предполагают, что отключение манглера может быть следующим лучшим решением:

https://github.com/graphql/graphql-js/issues/1182

https://github.com/rmosolgo/graphiql-rails/issues/58


Для тех, кто просто пытается запустить базовую настройку Sapper и Amplify, чтобы воспроизвести эту ошибку или иным образом, я создаю свою с помощью:

npm install -g @aws-amplify/cli

npx degit "sveltejs/sapper-template#webpack" my-app

npm install

npm install aws-amplify

npm install lodash (Кажется, это нужно для Amplify с помощью webpack)

amplify configure

npm run build

amplify init (среда разработки, код VS, javascript, без фреймворка, src каталог, __sapper__\build каталог распространения, профиль AWS по умолчанию. Это создает aws-exports.js.

In src/client.js:

import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);

npm run build

person nicedwar    schedule 23.10.2019