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 import
s 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?
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 .
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.
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.
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 .
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.
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 */);
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With