Heim >Web-Frontend >js-Tutorial >Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt

Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt

青灯夜游
青灯夜游nach vorne
2021-12-07 18:49:042478Durchsuche

So laden Sie JSON-Dateien in node im ECMAScript-Modul. Der folgende Artikel stellt Ihnen vor, wie NodeJS JSON-Dateien im ECMAScript-Modul lädt. Ich hoffe, er wird Ihnen hilfreich sein!

Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt

Nachdem Sie diesen Artikel gelesen haben, erfahren Sie:

1. Wie man JSON-Dateien lädt und analysiert 3. Lernen Sie import.meta .url

3. Neue URL lernen()

4. Wie wir alle wissen, wenn Sie json in CommonJS-Modul laden , laden Sie es einfach direkt über die Funktion require() und Sie können das json-Objekt erhalten.

Aber wenn Sie die JSON-Datei direkt in ECMAScript-Modul laden, wird ein Fehler wie folgt gemeldet:

Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt

Aktivieren Sie zunächst den ESM-Modus. Tatsächlich das offizielle Dokument (http://nodejs.cn /api/esm.html#introduction): CommonJS模块中加载json文件,只需通过require()函数直接加载即可,即能得到json对象。

但是在ECMAScript模块中直接加载json文件,会报错,报错如下:

Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt

首先,先启用ESM模式,其实官方文档(http://nodejs.cn/api/esm.html#introduction)中也有说明:

Node.js 默认将 JavaScript 代码视为 CommonJS 模块。 作者可以通过 .mjs 文件扩展名、package.json "type" 字段、或 --input-type 标志告诉 Node.js 将 JavaScript 代码视为 ECMAScript 模块

那怎么才能在ECMAScript模块加载json文件呢?其实是有两种方案的:

假设现在有一个json文件:test.json

文件内容如下:

{
    "name": "project"
}

接下来,在index.js中引入test.json:

一、 通过 fs 文件系统读取 json 文件

import { readFile } from "fs/promises"; // 以promise的方式引入 readFile API

const json = JSON.parse(
    await readFile(new URL('./test.json', import.meta.url))
)

console.log('[json1]:', json); // 输出: { "name": "project" }

解释:

await: 根据 ECMAScript 顶层 await 提案await 关键字可用于模块内的顶层(异步函数之外);

import.meta.urlnodejs中返回模块在本地的file://协议的绝对路径,例如:file://home/user/main.js, 如果模块中还有另外一个文件test.js,那么test.js的路径就是new URL('test.js', import.meta.url)

new URL: 生成file: 协议的对象(对于大多数 fs 模块函数,path 或 filename 参数可以作为使用 file: 协议的对象传入)。

二、 通过nodejs内置module模块的createRequire方法实现

import { createRequire } from "module";

const require = createRequire(import.meta.url);
const json = require('./test.json');

console.log('[json2]:', json); // 输出: { "name": "project" }

这种方法是根据nodejs提供的createRequire方法实现。

Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt

三、 24行源码的第三方库 load-json-file

Node.js behandelt JavaScript-Code standardmäßig als CommonJS-Modul. Autoren können die Dateierweiterung .mjs, das Feld package.json "type" oder das Feld --input-typeübergeben > Flag weist Node.js an, JavaScript-Code als ECMAScript-Modul zu behandeln

Wie kann ich also eine json-Datei in das ECMAScript-Modul laden? Tatsächlich gibt es zwei Lösungen: Angenommen, es gibt jetzt eine JSON-Datei: test.json

Der Inhalt der Datei lautet wie folgt:

import {readFileSync, promises as fs} from 'node:fs';

const {readFile} = fs;

const parse = (buffer, {beforeParse, reviver} = {}) => {

	// Unlike `buffer.toString()` and `fs.readFile(path, 'utf8')`, `TextDecoder`` will remove BOM.
        // 这里对buffer进行转义,没有用`buffer.toString()`和`fs.readFile(path, 'utf8')`,是因为`new TextDecoder().decode(buffer)`这种方式可以删除字节顺序标记(BOM)
        
        // 解码 buffer 并返回字符串
	let data = new TextDecoder().decode(buffer);
        
        // 在parse解析之前对字符串进行处理
	if (typeof beforeParse === 'function') {
		data = beforeParse(data);
	}

	return JSON.parse(data, reviver);
};

// 导出异步方法
export async function loadJsonFile(filePath, options) {
        // 如果未指定编码,则返回原始缓冲区。
	const buffer = await readFile(filePath);
	return parse(buffer, options);
}

// 导出同步方法
export function loadJsonFileSync(filePath, options) {
        // 如果未指定编码,则返回原始缓冲区。
	const buffer = readFileSync(filePath);
	return parse(buffer, options);
}
Als nächstes in index. js Führen Sie test.json ein:

1 Lesen Sie die json-Datei über den fs Dateisystem 🎜rrreee🎜Erläuterung: 🎜🎜<code>await: Laut ECMAScript Top Level await Vorschlag 🎜, das Schlüsselwort await kann auf der obersten Ebene innerhalb des Moduls (außerhalb der asynchronen Funktion) verwendet werden; 🎜🎜import .meta.url: nodejs gibt den absoluten Pfad des Moduls im lokalen file://-Protokoll zurück, zum Beispiel: file:// home/user/main.js, wenn es eine andere Datei test.js im Modul gibt, dann ist der Pfad von test.js new URL('test.js', import.meta.url) ; 🎜🎜neue URL: Erzeugt ein Objekt des file:-Protokolls (für die meisten fs-Modulfunktionen, path oder <code>filename kann als Objekt mithilfe des file:-Protokolls übergeben werden. 🎜

2. Implementieren Sie 🎜rrreee🎜 über die createRequire-Methode des integrierten module-Moduls von nodejs Die Methode wird basierend auf der von <code>nodejs bereitgestellten Methode createRequire implementiert. 🎜🎜Eine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt🎜

3. Die 24-zeilige Quellcode-Drittanbieterbibliothek load-json-file🎜🎜🎜load-json-file🎜 wurde von mir versehentlich entdeckt npm-Website. Der Quellcode besteht nur aus 24 Zeilen, wie folgt: 🎜rrreee🎜🎜load-json-file source code🎜 Insgesamt ist es relativ einfach, aber es gibt auch viele Wissenspunkte, die tiefgreifend erlernt werden können. 🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonEine kurze Analyse, wie nodejs JSON-Dateien im ECMAScript-Modul lädt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen