
Usar ECMAScript Modules en Node.js es ya una realidad y, con ello, no s贸lo vamos a tener que acostumbrarnos a una nueva sintaxis… tambi茅n hay ciertas ventajas de commonjs
que ahora mismo no sirven. Como importar archivos JSON usando simplemente un const data = require('file.json')
.
A d铆a de hoy para poder importar con ESModules un archivo .json
tienes que utilizar el flag --experimental-json-modules
al ejecutar Node.js tal y como explica la documentaci贸n oficial.
// index.mjs
import packageConfig from './package.json' assert { type: 'json' };
Necesitar铆as usar:
node index.mjs # esto falla
node --experimental-json-modules index.mjs # funciona!
Si no quieres usar esta medida experimental… 驴c贸mo puedes importar un archivo JSON actualmente usando ESModules?
Opci贸n 1: Leer y transformar el archivo JSON manualmente
La primera opci贸n, y la que yo recomendar铆a, es la de utilizar la API del File System de Node.js para leer el contenido del fichero y transformarlo en un JSON usando JSON.parse
.
import { readFile } from 'fs/promises'
// leemos el archivo usando top-level await y con
// codificaci贸n utf-8
const file = await readFile('./file.json', 'utf-8')
// transformamos el contenido en un JSON
const json = JSON.parse(file)
Opci贸n 2:
La segunda opci贸n es un poco m谩s complicada y se trata de reusar la conocida funcionalidad de require
en nuestro archivo donde usamos ESModules.
Para ello se usa createRequire
un m茅todo documentado en Node.js que te permite crear una funci贸n require
. Para ello hay que pasarle como argumento un string con el path absoluto o un objeto URL.
Lo mejor aqu铆 es aprovechar la propiedad import.meta.url
para que nos de exactamente la ruta del archivo y as铆 simular complemtanete la funcionalidad de require
.
import { createRequire } from "module"
const require = createRequire(import.meta.url)
const json = require("./file.json")
Conclusi贸n
Seguramente con la salida de Node.js 18 (si no ha salido en el momento que leas este art铆culo) ya estar谩 disponible una forma nativa de leer archivos JSON…
Aunque existir ya existe una propuesta aceptada y no me extra帽ar铆a que Node.js al final se decante por esta para mantener una compatibilidad total con la especificaci贸n.
La sintaxis ser铆a esta:
import json from "./foo.json" assert { type: "json" }
import("foo.json", { assert: { type: "json" } })
Ahora bien, mientras esto no es una realiadad, yo seguramente me quedar铆a con la primera opci贸n… y olvidarme por completo que commonjs
ha existido alguna vez.