JavaScript ||将 API 与 ES6 模块结合使用

标签 javascript api import export es6-modules

我目前正在练习在 JS (vanilla) 中使用 API 和 es6 模块。

app.js

import Game from './model/Game';

const proxy = 'https://cors-anywhere.herokuapp.com/';
let key = 'MY_API_KEY_PRIVATE'; //kept private for StackOverflow
let steamID = '76561197996900532';

getOwnedGames();

async function getOwnedGames() {

    try {

        const result = await fetch(`${proxy}http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=${key}&steamid=${steamID}&format=json&include_appinfo=true`);

        const data = await result.json();
        let gamesList = data.response.games;

        console.log(gamesList);

    } catch(error) {

        console.error(error);
    }

}

.

Game.js

export class Game {


}

现在,无需使用 import GotGames from './model/Game'; 即可正常工作,但会出现以下错误:

Uncaught SyntaxError: Cannot use import statement outside a module

通过在 HTML 的脚本标记中添加 type="module",我在这个空间中看到了类似的问题,但这会出现以下错误:

Access to script at 'my_file_path' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

为什么添加 type="module"会影响我的 API 调用?如何做到这一点?这是否与要求 Node.js 安装 webpack 有关?

最佳答案

您的问题实际上是一个非常广泛的问题,但我会尽力澄清其中的一些重要方面。

-剧透开始-

网络包。

-剧透结束-

请考虑到,即使它因不适合初学者而闻名,有些人仍将它与 Babel 和 React 一起视为 Web 开发技术的前沿。所以至少值得研究一次。简而言之,它将把您的 ES 模块转换为自定义系统(用普通的旧式 JavaScript 编写),该系统在技术上与所有浏览器兼容,并保留功能以及许多其他优点。

但是,为了简单起见,您可能想要使用像 React 这样的框架,它在底层使用 Webpack,因此您不必直接处理它。

真心推荐你this Medium article发现有关 JavaScript 和 NodeJS 模块历史的一些有趣事实。

最后,我们都同意 ES6 模块是 future ,但是,即使在解决了您的具体问题之后,您也会遗憾地发现 ES6 模块是一个非常新的标准,并且目前浏览器的支持相对较差。

回答您的问题:

默认情况下,浏览器不会将 JavasScript 文件解释为模块,因此您必须使用 type="module" 显式声明它们。脚本标签中的属性。这显然就是您遇到第一个错误的原因。

要正确导入“Game.js”模块,您必须重写导入语句,如下所示:import {Game} from './model/Game';因为您进行了命名导出。正如评论中所写,在 MDN 上阅读有关导入/导出的内容,您会更清楚。

最后,CORS 错误可能是由服务器配置错误引起的。特别是带有标题。您可能想尝试设置 Access-Control-Allow-Origin标题为 *或您的特定服务器名称,因此新请求将具有 Origin header 与 null 不同.

我希望这能为您指明一条扩展知识的好途径。

* 编辑:要解决单击打开文件时有关错误的注释中的问题,我建议使用以下不为人知的元标记 <meta http-equiv="Access-Control-Allow-Origin" content="*">当没有服务器时模拟http header。我不确定它是否有效,但从技术上讲应该可行,请在评论中告诉我,因为我很好奇。

参见this

关于JavaScript ||将 API 与 ES6 模块结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58943652/

相关文章:

c# - 如何将swagger导入带环境的 postman ?

ruby-on-rails - 葡萄 : required params with grape-entity

python - 如何将变量的值传递给python中的import语句

java - Android opencv 库引用无法正常工作

java - 如果使用导入而不是相同的包会发生变化

javascript - 防止按钮在第一次使用 Javascript 后减少数字

javascript - jQuery 悬停和滑动

javascript - 在 VIM 的脚本标签内正确缩进 javascript

javascript - webpack 获取 material-ui 的正确方法

json - 为什么一些带有地理标签的推文为空? (Twitter 流 API)