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功能的支持。
我刚刚在 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)
我不明白为什么会这样;如果有人知道为什么,请评论。
你必须使用.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)
对于我来说,加载 lodash 作为ES 库完成了这项工作,这里是相同的NPM 包。
Lodash 库导出为ES 模块。 https://www.npmjs.com/package/lodash-es
然后就可以正常导入utils了。
import { shuffle } from 'lodash-es';
Run Code Online (Sandbox Code Playgroud)