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'
。
我已经安装了 Node 8.9.1(同样的问题发生在 v10.5.0)。
我正在尝试在具有 .mjs
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'
。