Jak importovat soubory JSON v modulech ES (Node.js)

Moduly ES jsou v zemi Node.js stále poměrně nové (jsou stabilní od uzlu 14). Moduly jsou dodávány s vestavěným modulovým systémem a funkce, jako je nejvyšší úroveň, čekají.

Přečetl jsem si informativní příspěvek o modulech ES od Pawela Grzybka a zjistil jsem, že dnes nelze importovat soubory JSON do modulů ES. To je skutečný průšvih, protože jsem docela zvyklý dělat require volání jako const data = require('./some-file.json') v Node.js.

Aktualizace:Od Node.js 17.5 , je možné využít aserce importu v modulech ECMAScript k importu JSON soubory.

/* 
  Experimental JSON import is supported since Node.js 17.5
  $ node index.mjs
*/

// An import assertion in a static import
import info from `./package.json` assert { type: `json` };

// An import assertion in a dynamic import
const { default: info } = await import("./package.json", {
  assert: {
    type: "json",
  },
});

Ale pozor, moduly JSON jsou v Node.js stále označeny jako experimentální!

Jak se věci mají v zemi prohlížeče? Chrome dodává kontrolní výrazy pro import od v91 , a pokud je Babel ve vašem toolchainu, můžete ho začít používat!

Tento příspěvek vysvětluje způsoby, jak se vypořádat s JSON v modulech ES, pokud používáte verzi Node.js před 17.5 nebo nechcete používat --experimental-json-modules v Node.js 16 .

Možnost 1:Čtěte a analyzujte soubory JSON sami

Dokumentace Node.js doporučuje používat fs a proveďte práci při čtení souborů a jejich analýze sami.

import { readFile } from 'fs/promises';
const json = JSON.parse(
  await readFile(
    new URL('./some-file.json', import.meta.url)
  )
);

Možnost 2:Využijte CommonJS require funkce pro načtení souborů JSON

Dokumentace také uvádí, že můžete použít createRequire k načtení souborů JSON. Tento přístup je způsob, jakým Pawel radí ve svém příspěvku na blogu.

createRequire umožňuje vytvořit CommonJS require k použití typických funkcí CommonJS, jako je čtení JSON v modulech Node.js EcmaScript.

import { createRequire } from "module";
const require = createRequire(import.meta.url);
const data = require("./data.json");

Jak byste měli načítat soubory JSON?

Pro budoucnost jsou cestou import asercí a moduly ESM JSON !

U verzí Node.js, které je zatím nepodporují, nevím. 🤷‍♂️ Ani jedna možnost mi nepřijde dobrá, ale pravděpodobně zůstanu u první možnosti, protože je srozumitelnější.