使用 ESM 在浏览器中动态或静态导入 json

weg*_*gry 5 javascript google-chrome dynamic-import es6-modules

我有以下示例运行,而 JS 在它上面没有打包器。

// index.js
;(async () => {
  const mod = await import('/index.json')

  console.log(mod)
})()
Run Code Online (Sandbox Code Playgroud)
{
  "file": "index.json"
}
Run Code Online (Sandbox Code Playgroud)

Chrome 80 无法加载 json

加载模块脚本失败:服务器以“application/json”的非 JavaScript MIME 类型响应。每个 HTML 规范对模块脚本执行严格的 MIME 类型检查。

Firefox 73 以类似的方式失败:

由于不允许的 MIME 类型(“application/json”),从“ http://127.0.0.1:8080/index.json ”加载模块被阻止。

这种行为是可以克服的吗?

weg*_*gry 9

截至撰写本文时,导入断言现已处于第 3 阶段。

import json from "./foo.json" assert { type: "json" };

// or

import("foo.json", { assert: { type: "json" } });
Run Code Online (Sandbox Code Playgroud)

将是使用 ESM 拉入 JSON 文件的语法。


Dan*_*ank 7

您无法使用 ES6 导入直接导入 JSON。您需要从 JS 文件导出它:

// module.js
export default {
  "foo": { "bar": "baz" }
};
Run Code Online (Sandbox Code Playgroud)
// index.js
;(async () => {
  const mod = await import('/module.js')

  console.log(mod)
})()
Run Code Online (Sandbox Code Playgroud)

  • @AluanHaddad 是对的,但根本无法避免这种解决方法_直到_ [JSON 模块](https://github.com/tc39/proposal-json-modules) 最终获得批准。 (2认同)
  • @Rounin 是的,那将需要一段时间。模块注册表 API 已从加载器规范中删除,这真是太遗憾了。但是,我认为最好只使用 fetch 来加载 JSON,特别是在许多已经实现的 [top-level-await](https://github.com/tc39/proposal-top-level-await) 中环境。 (2认同)