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

时间:2017-11-14 04:51:37

标签: node.js node-modules

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

我正在尝试在带有.mjs

的文件中使用npm包中的命名导入
import { throttle } from lodash;

我跑:

node --experimental-modules index.mjs

我得到了:

  

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

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

6 个答案:

答案 0 :(得分:6)

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

  

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

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

 import { throttle } from lodash;

至少(至少现在)必须这样做:

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

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

答案 1 :(得分:3)

我只是在nodejs express * .mjs文件和为Googleapis启用 @IBOutlet weak var button: UIButton! override func viewDidLoad() { super.viewDidLoad() CATransaction.begin() let animation = CABasicAnimation(keyPath: "position") animation.fromValue = [view.layer.frame.width, 200] animation.toValue = [0, 200] animation.duration = 25.0 animation.repeatCount = .greatestFiniteMagnitude button.layer.add(animation, forKey: "animatePosition") CATransaction.commit() } 标志的情况下遇到了这个错误。

从“ googleapis”导入{google};

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

解决方案

import os

def connectToGoPro(user, host, password):
    command = "sshpass -p "+password+ " ssh " + user+"@"+host+" 'cd /boot; ls -l'"
    os.system(command) //This bit works

def takePhotos(fileName, captureCount):
    os.system("python3 ''"+ fileName + "' "+str(captureCount)+"'") //This bit doesn't work

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

答案 2 :(得分:1)

您必须使用.mjs扩展名。

  

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

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

更新

您似乎还没有导出该方法。

假设我有hello.mjs内容

export function sayHello() {
    console.log('hello')
}

我可以在index.mjs这样使用它

import {sayHello} from './hello.mjs'
sayHello()

答案 3 :(得分:0)

如果lodash已被编写为模块,并且lodash/index.mjs导出了throttleexport const throttle = ...;,那么您将能够import { throttle } from lodash;

这里的问题是,在commonjs中,没有诸如命名导出之类的东西。这意味着在commonjs模块中只能导出一件事。

所以认为lodash会导出一个包含名为throttle的属性的对象。

对于问题的第二部分,我相信人们一旦不再进行实验,就会慢慢开始采用ES模块。在撰写本文时,它仍然是(Node.js v11.14)。

答案 4 :(得分:0)

对于我来说,像 ES Library 一样加载lodash,这是 NPM软件包

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

然后,您可以通过常规方式导入实用程序

import { shuffle } from 'lodash-es';

答案 5 :(得分:0)

@machineghost答案有效。我记得还向package.json中添加了'type':'module'以及在节点v12(LTS)上使用esm,并且效果很好。##标题##

我将节点更新为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'

source