I've installed Node 8.9.1 (same problem happens in v10.5.0).
I'm trying to use named imports from npm packages in a file with the .mjs
import { throttle } from lodash;
I run:
node --experimental-modules index.mjs
and I get:
SyntaxError: The requested module 'lodash' does not provide an export named 'throttle' at ModuleJob._instantiate (internal/modules/esm/module_job.js:80:21)
--experimental-modules
are supposed to stop being experimental in v10 LTS, so why haven't more module authors jumped on the bandwagon?
--experimental-modules
does not have support for named exports yet:
--experimental-modules doesn't support importing named exports from a commonjs module (except node's own built-ins).
This is why you are unable to use the syntax:
import { throttle } from 'lodash';
Instead (for now at least) you have to destruct what you need:
import lodash from 'lodash';
const { throttle } = lodash;
Presumably someday Node will add support for all of the ES Module features.
You have to use .mjs
extension.
Once this has been set, files ending with .mjs will be able to be loaded as ES Modules.
reference: https://nodejs.org/api/esm.html
Update:
Looks like you haven't export the method yet.
Suppose i have hello.mjs
with content
export function sayHello() {
console.log('hello')
}
i can use it in index.mjs
like this
import {sayHello} from './hello.mjs'
sayHello()
If lodash had been written as modules, and lodash/index.mjs
exported throttle
: export const throttle = ...;
, then you'd be able to import { throttle } from lodash;
The problem here is that in commonjs there's no such thing as a named export. Which means that in commonjs modules export one thing only.
So think that lodash exports an object containing a property named throttle
.
For the second part of the question, I believe people will slowly start adopting ES Modules once it's not experimental anymore. At the time of this writing, it still is (Node.js v11.14).
For me loading lodash as ES Library did the job, here is the NPM Package for the same.
The Lodash library exported as ES modules. https://www.npmjs.com/package/lodash-es
Then you can import utils in normal way.
import { shuffle } from 'lodash-es';
来源:https://stackoverflow.com/questions/47277887/node-experimental-modules-requested-module-does-not-provide-an-export-named