【问题标题】:What does import Module from 'module' import when no default export is defined and why is it different from import * as Module?当没有定义默认导出时,import Module from 'module' import 是什么?为什么它与 import * as Module 不同?
【发布时间】:2016-06-03 05:13:06
【问题描述】:

我对 JavaScript 很陌生,最近一直在为导入而苦苦挣扎。有一件事我无法理解。

在可能使用 npm 安装的旧节点模块(主要是在 ES6 之前出现的那些)中,例如 express,通常没有定义默认导出。

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

import express from 'express';

可以通过尝试将整个模块导入为别名来规避此消息

import * as express from 'express';

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

const app = express();

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

当没有定义默认导出时,使用不带别名的 import 语句究竟导入了什么?我认为这是整个模块,但似乎并非如此。

【问题讨论】:

  • 这很可能是您的 IDE 的问题,它不知道您的模块加载器如何处理 ES6 之前的模块。如果它有效,您应该使用它,然后关闭通知或找到一种方法来声明链接模块的导出。
  • @Bergi IDE 通知不是问题,也不是问题的问题。正如我的 IDE 所指出的,当没有声明此类导入时,我对默认导入的内容更感兴趣。我可能应该说我正在使用 webpack 和 babel 和 es-2015 预设来将模块打包成一个包。我现在没有时间,但我会在有时间时编辑问题。
  • @DavidPacker WebStorm 在 Setting > Languages & Frameworks > JavaScript > Libraries > Download > express > Download and安装

标签: javascript import ecmascript-6


【解决方案1】:

如果没有定义默认导出,import Module from 'module' 会导入什么?

什么都没有。事实上,instantiating the module 会在导入的东西没有从导入的模块导出或导出多次时抛出SyntaxError

为什么和import * as Module不一样?

因为import * 只是导入一个module namespace object,它具有导出作为属性。如果您不导出任何内容,它将是一个空对象。

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

这意味着您不能将它们作为 ES6 模块导入。不过,您的 IDE 似乎预计会出现这种情况并发出警告。

那么,如果您在 import 声明中引用它们会发生什么?你的模块加载器可以用它做任何事情,HostResolveImportedModule 将返回一个不是source text "ES6 module" recordmodule record - 即它可以用 CommonJS 模块做任何与实现相关的事情。

【讨论】:

  • 因此,使用 ES6 语法而不是普通的 require 导入 pre-ES6 模块根本行不通,这可能是它这样做的唯一原因,因为 babel 转换?我是否正确理解了您的回答?
  • 不,它确实有效,因为您的模块加载器/捆绑器(在您的情况下为 webpack)适当地处理了 pre-ES6 模块。并非所有加载器/捆绑器都可能支持这一点,它取决于实现。但是考虑到导入旧的 commonjs 模块有多么有用,这不会中断。您的 IDE 的问题是它不知道这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
相关资源
最近更新 更多