TypeError: Amplify.configure is not a function with SvelteKit + Amplify AWS

TypeError: Amplify.configure is not a function with SvelteKit + Amplify AWS

我正在使用 AWS Amplify 对新的 SvelteKit FE 进行一些实践,以使用 Cognito 服务对我的应用程序进行身份验证,并且在开发模式下一切正常 运行。但是后来,我尝试构建它以进行部署,这就是乐趣开始的地方...

首先,我无法简单地构建应用程序。 Vite 无法正确“解释”“浏览器”字段时出现错误!? :

'request' is not exported by __vite-browser-external, imported by node_modules/@aws-sdk/credential-provider-imds/dist/es/remoteProvider/httpRequest.js

此问题记录在此处 (https://github.com/aws/aws-sdk-js/issues/3673) and here (https://github.com/aws-amplify/amplify-ui/issues/268)。

我应用了建议的解决方案,但 ErikCH 在 svelte.config.cjs 文件中添加了一个别名:

resolve: {
        alias: {
          "./runtimeConfig": "./runtimeConfig.browser"
        }
      }

所以现在,自从应用程序顺利构建以来,我又回到了正轨。但是后来,我尝试 运行 使用“npm 运行 预览”的应用程序,但它在这条消息上停止了:

TypeError: Amplify.configure is not a function

我仔细检查了我的代码,没有发现任何遗漏或不当之处。这是该函数的导入和调用:

...
import Amplify from '@aws-amplify/core';
import Auth from "@aws-amplify/auth";
import awsconfig from "../aws-exports";

Amplify.configure(awsconfig);
...

如前所述,项目 运行 处于开发模式,完全是 Javascript,没什么特别的。我更新到最新的所有包...这里是我的实际版本:

@sveltejs/kit": "^1.0.0-next.159
vite v2.5.1
"aws-amplify": "^4.2.5"
node v14.17.5
npm v7.21.1

我看到了关于完全删除 Amplify 库并编写包装器以直接调用 Cognito 的评论,但我发现这不是很有效率且很麻烦。所以,我最后的办法是调用 Whosebug 来救援! ;-)

编辑 #1 我意识到这个错误发生在 app.js,即 FE 应用程序的服务器端。这是不对的。这在浏览器中必须 运行。怎么会出现在服务器端???

我不完全确定这会让你走上正确的轨道,但有一件事情帮助我解决了包导入的怪异问题,尤其是在开发和构建之间时,vite's optimizedDeps config directive。也许 AWS 包中的某些东西不喜欢 vite 正在做的预捆绑,你需要排除它?这可能有助于解释为什么 运行 在开发时一切正常。

我必须将 Amplify 更改为命名导入,以便在构建后进行预览。

import { Amplify } from '@aws-amplify/core'

如果有人在使用 Amplify + SvelteKit 时遇到 'dev' 问题,将以下内容添加到 app.html<head> 标签的顶部可能会有所帮助。

    <script>
      var global = global || window
      var Buffer = Buffer || []
      var process = process || { env: { DEBUG: undefined }, version: [] }
    </script>

我的版本:

  • Node.js: 14.18.0
  • @aws-amplify/auth: 4.3.11
  • @aws-amplify/core: 4.3.3
  • @sveltejs/kit: 1.0.0-next.190
  • 打字稿:4.4.4