78

From https://2ality.com/2019/04/nodejs-esm-impl.html Node 12 should support es6 modules; however, I just keep getting the error:

Question: How do I make a MVP of using es6 modules in node 12?

package.json

{
  "name": "dynamic-es6-mod",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.mjs",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/index.mjs"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "globby": "^10.0.1"
  }
}
$ node -v
$ 12.6.0
$ npm run start


internal/modules/cjs/loader.js:821
  throw new ERR_REQUIRE_ESM(filename);
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/dev/dynamic-es6-mod/src/index.mjs
    at Object.Module._extensions..mjs (internal/modules/cjs/loader.js:821:9)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:839:10)
    at internal/main/run_main_module.js:17:11
Armeen Moon
  • 18,061
  • 35
  • 120
  • 233

12 Answers12

26

The official documentation for the module states, that v2 should be used with require().

There is a work around though. Instead being imported it can be loaded asynchronously:

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
dk1
  • 361
  • 3
  • 2
24

All you have to do is adding the flag --experimental-modules that supports the new es6 import/export statement also the order is important as the following.

    "start": "node --experimental-modules src/index.mjs "
  • 11
    This is not correct. Doesn't work with nodejs version 12 LTS and no mention of --experimental-modules in the nodejs documentation for version 12 or 14. I think this option was a feature in development that was removed. – Neutrino Jun 10 '20 at 13:25
  • 3
    Yes, was a feature before nodejs v12.00 as per this article https://medium.com/@nodejs/announcing-a-new-experimental-modules-1be8d2d6c2ff – abdulrahman alaa Jun 11 '20 at 17:00
  • 4
    Worked for me with version 12.16.1, IDK why it did not work for you @Neutrino – digender mahara Oct 11 '20 at 07:34
  • ```import Jimp from 'jimp';``` Was causing the same issue, ```import('jimp').then((jimp) => jimp.read(fileBuffer))``` Thank you so much, you saved my day – Kshitij Kulshrestha Apr 11 '23 at 14:38
17

In Node 14 I solved it with workaround.

source of workaround: https://github.com/eslint/eslint/issues/12319#issuecomment-535799024

short summary:

  1. your root level package.json doesn't support ESM
  2. subdirectory does - in src directory place package.json with { "type": "module" }

PS: ESLint team can't solve it easily right now, just because of core design... :(

Michal Miky Jankovský
  • 3,089
  • 1
  • 35
  • 36
5

You have to add this line of code in your package.json file "type" : "module" You will be able to use imports statements instead of require if I get your question correctly.

Your package.json will look as follows:

{
  "name": "dynamic-es6-mod",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.mjs",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/index.mjs"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "globby": "^10.0.1"
  }
}
karel
  • 5,489
  • 46
  • 45
  • 50
crispengari
  • 7,901
  • 7
  • 45
  • 53
3
  1. Go to package.json file and write "type":"module", above debug like this:
"name": "npmmodule",
"version": "1.0.0",
"main": "index.js",
"type": "module",
  1. Use import instead of require:
import chalk from 'chalk';

console.log(chalk.blue("hello world"));
Tyler2P
  • 2,324
  • 26
  • 22
  • 31
3

Solved use https://www.npmjs.com/package/nanoid-esm

import nanoid from 'nanoid-esm';
console.log(nanoid())
Manas Khandelwal
  • 3,790
  • 2
  • 11
  • 24
Pash
  • 345
  • 4
  • 11
0

I had a hell of a time with all this. I'm just posting my solution repo, in hopes it helps someone else.

This imports an ESM dependency (ora) into TypeScript without using babel. https://github.com/jason-henriksen/typescript-with-esm-no-babel-boilerplate

  • 1
    Hi, I think I am going through what you went through. I am unable to understand your solution. Can you please elaborate further please? Also, I haven't cloned your repo yet. Does that explains the solution? – Pramod Dec 30 '21 at 05:46
-1

You can try with "jest-preset-angular": "11.0.0-rc.3".

It works in my case: Angular v13+ and node v16+.

Dios Vo
  • 1
  • 1
  • 1
  • 1
-1

Use previous or older version of your installed node module. It will work.

  • 2
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community May 09 '22 at 13:31
  • 2
    Always nice to provide some additional details for an actual answer. It's a very generic answer and is more of a comment than a solution. – CodeFinity Jul 03 '22 at 13:36
-3

Try using npm's esm module which will support es6 (It can also be used in production).

Sm Srikanth
  • 1,992
  • 1
  • 10
  • 10
-3

For Node.js:

Tell Node to ignore the error.

const Module = require('module')
const orig = Module._extensions['.js']
const fs = require('fs')
Module._extensions['.js'] = function (module, filename) {
  try {
    return orig(module, filename)
  } catch (e) {
    if (e.code === 'ERR_REQUIRE_ESM') {
      // From: https://github.com/nodejs/node/blob/c24b74a7abec0848484671771d250cfd961f128e/lib/internal/modules/cjs/loader.js#L1237-L1238
      const content = fs.readFileSync(filename, 'utf8')
      module._compile(content, filename)
      // --
      return
    }
    throw e
  }
}

Use Babel to transpile on-the-fly.

require('@babel/register', {
  ignore: (f) => {
    // Don't ignore the package we want to transpile.
    if (f.match('semver-regex') return false
    // Prevent babel transpiling anything else in `node_modules`.
    return f.match('node_modules')
  },
  overrides: [{
    // Set preset to be used to transpile our ESM package.
    test: /semver\-regex/,
    presets: ['es2015'],
  }]
})

// Call the rest of your code.
require('./index.js')

For Webpack:

Do similar but with Babel loaders and without the Node require hook.

vaughan
  • 6,982
  • 6
  • 47
  • 63
-6

Just need to update node:

run: nvm install 15 nvm use 15

credit: https://www.youtube.com/watch?v=sUkCszM2gvU https://www.youtube.com/watch?v=sUkCszM2gvU