来自'模块'的导入模块是什么?导入时没有定义默认导出,为什么它与导入*作为模块不同?

时间:2016-02-20 17:30:02

标签: javascript import ecmascript-6

我是JavaScript的新手,最近一直在努力进口。有一件事我无法解决。

在较旧的节点模块(大多数是ES6之前的光源)中,可以使用npm安装,例如express,通常不会定义默认导出。

我的IDE(WebStorm)标记以下行,默认导出未在导入的模块通知中声明。

import express from 'express';

尝试使用

将整个模块导入为别名,可以绕过此消息
import * as express from 'express';

隐式告诉我的IDE只导入所有内容并将其命名为express,但是这样做会导致在尝试在以下行上实例化应用程序时 express不是函数错误

const app = express();

特别是原始导入(没有别名)有效。

如果没有定义默认导出,使用不带别名的import语句导入的确切内容是什么?我认为这是整个模块,但似乎并非如此。

1 个答案:

答案 0 :(得分:6)

  

未定义默认导出时import Module from 'module'导入什么内容?

无。事实上,instantiating the module会在导入某些内容时抛出SyntaxError,而这些内容未从导入的模块中多次导出或导出。

  

为什么它与import * as Module不同?

因为import *只导入具有导出属性的module namespace object。如果你不输出任何东西,那么它就是一个空的对象。

  

在较旧的ES6前节点模块中,通常没有定义默认导出。

这意味着您无法将它们作为ES6模块导入。您的IDE似乎期望这样做并发出警告。

那么如果你在import声明中引用它们会发生什么?您的模块加载器可能会对其执行任何操作,HostResolveImportedModule将返回不是module recordsource text "ES6 module" record - 即它可能会执行与CommonJS模块相关的任何实现。