node --experimental-modules,请求的模块不提供名为

node --experimental-modules, requested module does not provide an export named

我已经安装了 Node 8.9.1(同样的问题发生在 v10.5.0)。

我正在尝试在具有 .mjs

的文件中使用来自 npm 包的命名导入
import { throttle } from lodash;

我运行:

node --experimental-modules index.mjs

我得到:

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 应该是 stop being experimental in v10 LTS,那么为什么没有更多的模块作者加入这个行列呢?

您必须使用 .mjs 扩展程序。

Once this has been set, files ending with .mjs will be able to be loaded as ES Modules.

参考:https://nodejs.org/api/esm.html

更新:

看起来您还没有导出方法。

假设我有 hello.mjs 内容

export function sayHello() {
    console.log('hello')
}

我可以像这样在index.mjs中使用它

import {sayHello} from './hello.mjs'
sayHello()

经过编辑的新(更好的)答案

Node 团队……很慢。与此同时,为我们带来 Lodash 的同一个人 (John-David Dalton) 设想了一个 绝妙的 解决方案,他的想法是在 2019 年获得完整 ES6 模块支持的最佳方式。

(事实上,我 删除我之前的回答,但出于历史目的,我已将其保留。)

新的解决方案非常简单。

第 1 步:

npm i esm

https://www.npmjs.com/package/esm 包裹详情)

步骤 #2:

node -r esm yourApp.js

这就是它的全部:真的就是这么简单。只需添加 -r esm 作为 Node arg,一切都会神奇地工作(它甚至比 --experimental-modules 更少输入!)谢谢 John-David Dalton!!!

正如我在原来的回答中所说,大概 总有一天 Node 最终会发布完整的 ES6 支持,但是当发生这种情况时,采用它就像删除“-r esm”一样容易来自一些脚本 :D

最后,为了感谢,虽然我没有通过他的回答找到它,但在我进行此更新之前很久,@Divyanshu Rawat 实际上就该库的前身提供了答案。

原始答案

--experimental-modules 尚不支持命名导出:

--experimental-modules doesn't support importing named exports from a commonjs module (except node's own built-ins).

这就是您无法使用语法的原因:

 import { throttle } from 'lodash';

相反(至少现在)你必须破坏你需要的东西:

 import lodash from 'lodash';
 const { throttle } = lodash;

大概有一天 Node 会添加对所有 ES 模块功能的支持。

如果 lodash 被编写为模块,并且 lodash/index.mjs 导出 throttle: export const throttle = ...;,那么您将能够 import { throttle } from lodash;

这里的问题是在 commonjs 中没有命名导出这样的东西。这意味着在 commonjs 模块中只导出一件事。

所以认为 lodash 导出了一个对象,其中包含一个名为 throttle 的 属性。

对于问题的第二部分,我相信一旦 ES 模块不再处于实验阶段,人们就会慢慢开始采用它。在撰写本文时,它仍然是 (Node.js v11.14).

对我来说加载 lodash 作为 ES 库 完成了工作,这是相同的 NPM 包

Lodash 库导出为 ES 模块https://www.npmjs.com/package/lodash-es

然后就可以正常导入utils了。

import { shuffle } from 'lodash-es';

我刚刚在 nodejs express *.mjs 文件和为 googleapis 启用了 --experimental-modules 标志时遇到了这个错误。

import { google } from "googleapis";

SyntaxError: The requested module 'googleapis' does not provide an export named 'google'

解决方案

//not working!
//import { google } from "googleapis";

//working
import googleapis from "googleapis";
const { google } = googleapis;

我不明白为什么会这样;如果有人知道为什么,请评论。

@machineghost 回答有效。我还记得将 'type':'module' 添加到 package.json 以及将 esm 与节点 v12(LTS) 一起使用并且效果很好。## Heading ##

我将我的节点更新为 v14(当前),但出现错误

C:\Users\andey\Documents\Project\src\app.js:1
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: 
C:\Users\andey\Documents\Project\src\app.js
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1217:13) {
code: 'ERR_REQUIRE_ESM'
}

要修复它,我必须从 package.json 中删除 'type':'module'

source