当没有定义默认导出时,从'module'导入模块导入什么?为什么它与import*作为模块不同?

And*_*ndy 10 javascript import ecmascript-6

我是JavaScript的新手,最近一直在努力进口.有一件事我无法绕过头脑.

在较旧的节点模块(主要是那些在ES6之前看到灯光的模块)中,可以使用npm安装,例如express,通常没有定义默认导出.

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

import express from 'express';
Run Code Online (Sandbox Code Playgroud)

尝试将整个模块作为别名导入时,可以避免此消息

import * as express from 'express';
Run Code Online (Sandbox Code Playgroud)

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

const app = express();
Run Code Online (Sandbox Code Playgroud)

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

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

Ber*_*rgi 7

import Module from 'module'没有定义默认导出时导入什么?

没有.实际上,实例化模块SyntaxError在导入的某些内容中抛出一个未从导入的模块多次导出或导出的内容.

为什么它不同import * as Module

因为import *只导入一个具有导出为属性的模块命名空间对象.如果你不导出任何东西,它将是一个空对象.

在较旧的ES6前节点模块中,通常不会定义默认导出.

这意味着您无法将它们作为ES6模块导入.您的IDE似乎期望尽管如此并提出警告.

那么如果你在import声明中提到它们会发生什么呢?你的模块加载可能对它做任何事,和HostResolveImportedModule将返回一个模块的记录,是不是一个源文本"ES6模块"记录 -也就是说,它可能会做任何事情的实现依赖与CommonJS的模块.

  • 不,它确实可以工作,因为您的模块加载器/捆绑器(在您的情况下为webpack)会正确处理ES6之前的模块。并非所有的加载程序/捆绑程序都可能支持此功能,因为它取决于实现。但是鉴于导入旧的commonjs模块非常有用,这不会中断。您的IDE的问题在于它对此一无所知。 (2认同)