在浏览器和 NodeJS 中单个 API 加载 JSON 文件?

Single API to load JSON file in Browser and NodeJS?

是否存在可用于在浏览器和 Node 中加载 JSON 文件的现有 API 或库?

我正在开发一个模块,我打算通过 NodeJS 的命令行和浏览器 运行。我正在使用两者通用的最新语言功能(并且不需要支持旧版浏览器),包括 class 关键字和 ES6 导入语法。有问题的 class 需要加载一系列 JSON 文件(其中第一个文件标识需要加载的其他文件),我的偏好是按原样访问它们(它们是外部定义的并且与其他工具共享)。

“导入”命令看起来可能适用于第一个 JSON 文件,除了我没有看到使用它加载一系列文件的方法(由第一个文件确定)进入变量。

一个选项是将辅助函数传递给 class 以加载文件,根脚本将根据需要为 NodeJS 或浏览器填充这些文件。

或者,我目前的主要想法是定义一个单独的模块,其中包含可以导入的“async function loadFile(fn)”函数,并设置不同的路径该文件的版本加载浏览器与 NodeJS。

这似乎应该有一个本机选项,或者其他人已经为其编写了一个模块,但我还没有找到。

对于节点,从 npm 安装 node-fetch 模块。

请注意,浏览器 fetch 无法直接与您的文件系统对话——它需要请求另一端的 HTTP 服务器。 Node 可以与您的文件系统对话,也可以对服务器进行 HTTP 调用。

目前看来,还没有完美的解决方案。 'fetch' API 是最有前途的,但前提是有一天 Node 会实现它。

与此同时,我已经确定了一个简单的解决方案,它可以无缝地工作,依赖最少,只需要对我的 ExpressJS 服务器路径进行一点魔法,就可以将服务的 Web 实例指向不同版本的 utils.js。

注意:要在 NodeJS (v14+) 中使用 ES-style 导入语法,您必须在 package.json 中设置“type”:“module”。有关详细信息,请参阅 https://nodejs.org/api/esm.html#esm_package_json_type_field。这对于真正的共享代码库是必要的。

使用它的模块(NodeJS + 浏览器运行 同一个文件):

import * as utils from "../utils.js";
...
var data = await utils.loadJSON(filename);
...

utils.js 浏览器:

async function loadJSON(fn) { 
    return $.getJSON(fn); // Only because I'm using another JQuery-dependent lib
    /* Or natively something like
    let response = await fetch(fn);
    return response.json();
    */
}

export { loadJSON };

utils.js 对于 nodeJS

import * as fs from 'fs';

async function loadJSON(fn) {
    return JSON.parse(await fs.promises.readFile(fn));
}

export { loadJSON };