ECMAScript 新提案:JSON模块

目录
文章目录隐藏
  1. 1. 导入 config.json
  2. 2. JSON 模块提案
  3. 3. 启用 JSON 模块
  4. 4.总结

ECMAScript 模块系统( import 和 export 关键字)默认只能导入 JavaScript 代码。

但是,将应用程序的配置保存在一个 JSON 文件中往往很方便,因此,我们可能想直接将 JSON 文件导入 ES 模块中。

长期以来,commonjs 模块格式支持导入 JSON。

好消息是,第三阶段的一个名为 JSON 模块的新提议,提出了一种将 JSON 导入到 ES 模块的方法。现在,我们来看看 JSON 模块是如何工作的。

1. 导入 config.json

假设,我们有一个 config.json 文件,内容如下:

{
  "name": "My Application",
  "version": "v1.2"
}

如何将 config.json 导入 ES 模块?

例如,我们创建一个简单的 Web 应用程序,从 JSON 配置文件中显示应用程序的名称和版本。

如果你试图直接导入 config.json ,Node.js 会抛出一个错误。

import http from 'http';
import config from './config.json';
http
  .createServer((req, res) => {
    res.write(`App name: ${config.name}\n`);
    res.write(`App version: ${config.version}`);
    res.end();
  })
  .listen(8080);

尝试运行应用程序时,node.js 抛出错误 TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".json"

node.js 抛出错误

Node.js 在使用 import语句时,默认期望的是 JavaScript 代码。但由于 JSON 模块的提议,你可以表明你要导入的数据类型:JSON

在修复应用程序之前,我们先来看看 JSON 模块提案有哪些内容。

2. JSON 模块提案

JSON 模块提案的本质是允许使用常规的import语句在 ES 模块中导入 JSON 数据。

可以通过添加导入断言来导入 JSON 内容:

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

assert {type: "json"}是一个导入断言,指示模块应该被解析和导入为 json。

jsonObject变量包含解析file.json的内容后创建的普通 JavaScript 对象。

一个 JSON 模块的内容是使用默认导入的,命名的导入不可用。

JSON 模块也可以动态导入:

const { default: jsonObject } = await import('./file.json', {
  assert: {
    type: 'json'
  }
});

当一个模块被动态导入时,包括一个 JSON 模块,默认的内容在default属性中可用。

在这种情况下,导入断言表示 JSON 类型。但是,有一个更通用的提议导入断言(目前在第 3 阶段),允许导入更多数据格式,如 CSS 模块。

3. 启用 JSON 模块

现在,我们将 JSON 模块集成到 Web 应用程序中:

import http from 'http';
import config from './config.json' assert { type: "json" };
http
  .createServer((req, res) => {
    res.write(`App name: ${config.name}\n`);
    res.write(`App version: ${config.version}`);
    res.end();
  })
  .listen(8080);

主模块现在导入config.json文件,并访问其值config.nameconfig.version

启用 JSON 模块

JSON 模块工作在 Node.js 版本>=17.1中,也可以使用--experimental-json-modules标志启用 Experimental JSON 模块。

node --experimental-json-modules index.mjs

在浏览器环境中,JSON 模块从 Chrome 91 开始可用。

4.总结

默认情况下,ES 模块只能导入 JavaScript 代码。

由于 JSON 模块的提议,你可以直接将 JSON 内容导入到 ES 模块中。只要在导入语句后使用导入断言就可以了。

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

你可以从 Node.js 17.1 开始使用 JSON 模块,使用实验性标志--experimental-json-modules,并在 Chrome 91 及以上版本中使用。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » ECMAScript 新提案:JSON模块

发表回复