DarkLite1
DarkLite1

Reputation: 14755

Import '.json' extension in ES6 Node.js throws an error

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

Answers (6)

Idir Hamouch
Idir Hamouch

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
  • Destructuring such as { name, version } is not possible in the import declaration directly
  • The contents of the JSON file are exported as a default export, so they need to be imported from default.

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

Arthur Ronconi
Arthur Ronconi

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

Ivan Gabriele
Ivan Gabriele

Reputation: 6920

2022

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

CODEHUB
CODEHUB

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

Carter Cobb
Carter Cobb

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

Ahmed Khattab
Ahmed Khattab

Reputation: 2799

try to use

process.env.npm_package_version

this might help you

Upvotes: -16

Related Questions