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

sta*_*ave 17 node.js node-modules

我安装了Node 8.9.1(在v10.5.0中也出现了同样的问题).

我正在尝试使用npm包中的命名导入 .mjs

import { throttle } from lodash;
Run Code Online (Sandbox Code Playgroud)

我跑:

node --experimental-modules index.mjs
Run Code Online (Sandbox Code Playgroud)

我得到:

SyntaxError:请求的模块'lodash'在ModuleJob._instantiate中没有提供名为'throttle'的导出(internal/modules/esm/module_job.js:80:21)

--experimental-modules应该停止在v10 LTS中进行实验,那么为什么没有更多的模块作者跳上这个潮流呢?

mac*_*ost 11

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

--experimental-modules不支持从commonjs模块(节点自己的内置组件除外)导入命名导出。

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

 import { throttle } from 'lodash';
Run Code Online (Sandbox Code Playgroud)

相反(至少现在),您必须破坏所需的东西:

 import lodash from 'lodash';
 const { throttle } = lodash;
Run Code Online (Sandbox Code Playgroud)

大概有一天,Node将增加对所有ES Module功能的支持。

  • 我不明白你不同意什么:Lodash 就是这样写的。您关于 lodash 以其他方式编写的假设讨论并不会使答案无效。 (5认同)
  • 遗憾的是,对于 Node.js > v12.12.0(包括所有 Node.js 13 和 Node.js 14),**此包不起作用**。这个问题已经开放几个月了,所以我对这个包没有太多期望。问题链接:[https://github.com/standard-things/esm/issues/868](https://github.com/standard-things/esm/issues/868) (3认同)

Cod*_*ife 8

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

从“googleapis”导入{google};

SyntaxError:请求的模块“googleapis”未提供名为“google”的导出

解决方案

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

//working
import googleapis from "googleapis";
const { google } = googleapis;
Run Code Online (Sandbox Code Playgroud)

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


Tua*_*ran 7

你必须使用.mjs扩展。

设置完成后,以 .mjs 结尾的文件将能够作为 ES 模块加载。

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

更新:

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

假设我有hello.mjs内容

export function sayHello() {
    console.log('hello')
}
Run Code Online (Sandbox Code Playgroud)

index.mjs我可以这样使用它

import {sayHello} from './hello.mjs'
sayHello()
Run Code Online (Sandbox Code Playgroud)

  • OP 询问如何从 npm 模块导入,而不是他们自己的模块。 (13认同)

Div*_*wat 7

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

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

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

import { shuffle } from 'lodash-es';
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚添加了对我有帮助的内容,有人否决了它,任何人都可以解释一下。 (2认同)
  • 我不知道为什么这最初被否决了;也许你解释得不够好?如果有任何安慰的话,我实际上已经更新了我的(已接受的)答案以提及“esm”模块,我相信它是您提到的模块的后继者(FWIW我赞成您的答案)。 (2认同)