Reputation: 14755
We're trying to use the new ways of exporting and importing modules for ES6 with Node.js. It's important for us to get the version number from the package.json
file. The following code should do that:
import {name, version} from '../../package.json'
However, on execution the following error is thrown:
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".json" for T:\ICP\package.json imported from T:\ICP\src\controllers\about.js
Is there something we're missing?
Is the extension .json
not supported?
Is there another way to retrieve this information using Node.js 13+?
Upvotes: 121
Views: 92267
Reputation: 2058
With Node.js 18.20.0 onward:
import myToken from './MyToken.json' with {type: "json"};
From Node.js version 17.5.0 onward, importing a JSON file is possible using Import Assertions:
import packageFile from "../../package.json" assert { type: "json" };
const {
name,
version
} = packageFile;
assert { type: "json" }
is mandatory{ name, version }
is not possible in the import
declaration directlydefault
.The dynamic import version looks like this:
const {
default: {
name,
version
}
} = await import("../../package.json", {
assert: {
type: "json"
}
});
Since import assertions and JSON modules have only recently promoted to stage 3, older versions of Node.js might have supported an older syntax.
According to the compatibility tables on MDN for import
declarations and dynamic import
, older versions of Node.js (16.0.0 – 16.14.0 and 17.0.0 – 17.4.0) had varying support:
These versions required the --experimental-json-modules
flag:
node --experimental-json-modules about.js
Some versions did not support import assertions on dynamic import
Some versions did not support the "json"
type, specifically
Some versions relied on an older proposal which did not specify the assert
syntax yet
Upvotes: 175
Reputation: 2428
I had this same issue when compiling using Vite. Not even changing with
to asset
worked for me, I had to change the file from .json
to .js
and add export default
at the beginning of the file to be able to import the data.
For me, this was the solution and it also simplified all the NodeJS syntax bureaucracy.
Upvotes: 0
Reputation: 6920
From Node.js v16 & v18 official documentation:
import SomeJson from './some.json' assert { type: 'json' }
And run it with the matching experimental flag:
node --experimental-json-modules ./your-file.js
Upvotes: 22
Reputation: 542
You can use it as in docs node-js as follow:
import { readFile } from 'fs/promises';
const json = JSON.parse(await readFile(new URL('../../package.json', import.meta.url)));
Upvotes: 28
Reputation: 840
You can sill import require
in an ES6 module for Node.js:
import { createRequire } from "module"; // Bring in the ability to create the 'require' method
const require = createRequire(import.meta.url); // construct the require method
const my_json_file = require("path/to/json/your-json-file.json") // use the require method
Upvotes: 65