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

我试图在一个文件中使用来自npm包的命名导入,文件名为.mjs

import { throttle } from lodash;

我跑:

node --experimental-modules index.mjs

我得到:

SyntaxError:请求的模块"lodash"未提供名为"throttle"的导出

--experimental-modules应该是stop being experimental in v10 LTS,那么为什么没有更多的模块作者加入这股潮流呢?

推荐答案

EDITED NEW (AND MUCH BETTER) ANSWER

node 团队是...缓慢的与此同时,给我们带来Lodash的同一个人(John David Dalton)设想了一个brilliant解决方案,他的 idea 是2019年获得ES6模块全面支持的最佳方式.

(事实上,我很想删除我之前的答案,但出于历史原因,我把它留了下来.)

新的解决方案非常简单.

Step #1:

npm i esm

(https://www.npmjs.com/package/esm用于包装细节)

Step #2:

node -r esm yourApp.js

这就是全部:真的就这么简单.只需添加-r esm作为 node 参数,一切都会神奇地工作(它甚至比输入--experimental-modules更少!)谢谢约翰·大卫·道尔顿!!!

正如我在最初的回答中所说,大概someday Node最终将发布完整的ES6支持,但当这发生时,采用它将与从几个脚本中删除"-r esm"一样简单:D

最后,在我没有通过他的回答找到答案的情况下,@Divyanshu Rawat在我进行此更新之前很久就提供了一个关于该库前身的答案.

ORIGINAL ANSWER

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

--实验模块不支持从commonjs模块导入命名导出( node 自身的内置除外).

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

 import { throttle } from 'lodash';

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

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

大概有一天,Node将添加对所有ES模块功能的支持.

Node.js相关问答推荐

查询嵌套数组中的最后一个元素具有特定值的mongoDB集合中的文档

聚合发布/订阅消息

Sveltekit停靠的应用程序找不到从Build导入的包

如何将我的Redis客户端配置为在禁用群集模式的情况下使用读取副本?

无法使用Sequelize连接AWS RDS

try 使用Express和连接池将数据插入MySQL数据库时出现拒绝访问错误

无法从MongoDB文档中保存的对象数组中获取对象的属性

Typescript 正则表达式:过滤器返回空

为什么当我使用waitForSelector时 Puppeteer 导致我的测试套件挂起 30 秒,即使我在页面和浏览器上调用关闭?

如何修改这个flake.nix,这样我就不用每次加载环境都加载nix包了

在 nodejs 中使用 multer 上传文件返回未定义的 req.file 和空的 req.body

Express.js - 监听请求中止

从数据库读取数据并将其作为可下载的 zip 文件发送

在 `DataFrame` 上使用用户定义的可链接函数抽象出 Polars 表达式

如何在 cypress 测试中进行计算

baseurl64 缓冲区解码

`npm install` 以Killed结尾

使用 nvm-windows 时更新 npm

在 Node.js 与 Cron 作业(job)中设置间隔?

如何在 MongoDB 上只收听 localhost