node.js - Node --experimental-modules,请求的模块不提供名为的导出

标签 node.js node-modules

我已经安装了 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 ,那么为什么没有更多的模块作者加入这个潮流呢?

最佳答案

编辑了新的(更好的)答案

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 模块功能的支持。

关于node.js - Node --experimental-modules,请求的模块不提供名为的导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47277887/

相关文章:

javascript - 使用 Typescript+VSCode 调试 Node.js 异步/等待

javascript - 使用带有 Node 的 facebook graph api 获取性别和年龄

javascript - Node.js 和 Express 的关系

node.js - 如何让 formik 进行编译?

node.js - 被 Node js ssl 服务器错误消息 "Assertion failed: (wrap->ssl_) != (nullptr), file src\tls_wrap.cc, line 319"难住了

javascript - Node.js、Express、i18n 中的国际化

javascript - 嵌入式 Node/javascript 沙箱?

reactjs - 如何在使用 TypeScript 时使用 src 文件夹中的本地包设置 create-react-app?

javascript - 类型错误 : x is not a function in Node. js

javascript - 无法使用 Node js process.kill(pid) 终止 linux 进程