Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Import ES module in Next.js ERR_REQUIRE_ESM

I came upon this error when trying to use ky in a Next.js project:

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /foo/node_modules/ky/index.js

I think the problem is that Webpack (or Babel) is transforming all imports to require()s but ky is a pure ES module.

I got it working by dynamically importing ky before using it but it's not elegant nor efficient.

const handleFormSubmit = async (event) => {
  const ky = (await import("ky")).default;

  const response = await ky
    .get('http://localhost/api/foo')
    .json();
};

Any suggestions?

like image 802
Camilo Avatar asked Jan 30 '21 23:01

Camilo


People also ask

How do you solve require () of ES modules is not supported?

You can solve the "[ERR_REQUIRE_ESM]: require() not supported" by doing one of two things: Use ESM - use import foo from 'foo' , instead of const foo = require('foo') and add the following line to your package. json file: "type": "module" . Downgrade to the last version of the package that is built with CommonJS .

How do I enable ES modules in node js?

To be able to load an ES module, we need to set “type”: “module” in this file or, as an alternative, we can use the . mjs file extension as against the usual . js file extension. Also, from Node version 12.7.

What is Nextjs dynamic import functionality?

Examples. Next. js supports lazy loading external libraries with import() and React components with next/dynamic . Deferred loading helps improve the initial loading performance by decreasing the amount of JavaScript necessary to render the page.

What is an Esmodule?

As of ES6 (ES2015), JavaScript supports a native module format called ES Modules, or ECMAScript Modules. This is modern way to do modules in JavaScript. This approach uses the export and import keywords, instead of the older CommonJS syntax of module. exports and require .


3 Answers

From Next.js 12, support for ES Modules is now enabled by default, as long as the ESM library has "type": "module" in its package.json. Using next-transpile-modules to transpile ESM libraries is no longer required.


Before Next.js 12

Since ky is exported as ESM you can transpile it with next-transpile-modules in next.config.js.

// next.config.js
const withTM = require('next-transpile-modules')(['ky']);

module.exports = withTM(/* your Next.js config */);
like image 52
juliomalves Avatar answered Oct 11 '22 02:10

juliomalves


You can try upgrading nextjs to v11.1.0, it has some support for ESM.

See: https://github.com/vercel/next.js/pull/27069

More info in this issue discussion from https://github.com/vercel/next.js/issues/9607#issuecomment-906155992

like image 28
Adam Banko Avatar answered Oct 11 '22 03:10

Adam Banko


Since Next.js 12 (official announcement), support for ESM modules is automatically enabled. See #29878.

Since Next.js 12.1, you can add "type": "module" to your package.json. See #33637.

like image 4
Richie Bendall Avatar answered Oct 11 '22 04:10

Richie Bendall