在Typescript / ES6中导入* vs import {specificName}?

时间:2016-10-15 15:44:19

标签: javascript typescript ecmascript-6 amd

声明

declare module "MyModule" {

export function Foo() {...}
export function Bar() {...}

}

我只需要Foo,我应该如何导入它?

import * as MyModule from "MyModule";

MyModule.Foo();

import {Foo} from "MyModule";
Foo()

哪一个比另一个更好?以第一种方式导入所有出口是否有任何性能影响?

在发布问题之前我读过的一些参考文献:

https://www.exratione.com/2015/12/es6-use-of-import-property-from-module-is-not-a-great-plan/

4 个答案:

答案 0 :(得分:5)

import {} from ...语法使得对函数的存根和间谍非常困难,并且通常需要额外的库,例如rewire.js。警告是树摇动也不起作用。我倾向于保持我的util模块很小,每个模块可能只包含2-3个功能。这样我可以使用模块的import * as ...语法和第三方模块的import {} ...。从而最大限度地减少树木摇晃的需

答案 1 :(得分:4)

仅向代码导入必要的内容当然是良好做法。假设有人写了几千行代码导入所有内容,然后你尝试分析它。您是否认为您很容易知道代码中使用的哪些函数是导入的,哪些不是?显然这是可疑和不良做法

关于表现,我认为影响不大。

答案 2 :(得分:1)

如果您只需要 Foo,我认为最好只导入Foo。这使您的代码更加清晰,因为通过查看该导入,您可以确定代码正在使用的MyModule的哪些元素。

它不会影响性能,因为您必须阅读/下载整个文件。

此外,使用像Rollup.js这样的捆绑包时选择哪个选项并不重要 - 即使您从MyModule导入所有内容,该捆绑包也只包含您在代码中实际使用的内容。< / p>

答案 3 :(得分:0)

如果有人还在寻找答案,我已经分享了我对此的看法。

  • 假设您有一个 JSON 文件,并且想要将整个模块作为变量导入,然后使用 import *
  • 如果您有一个具有多个导出方法的模块(可以是第 3 方包),那么您应该使用 import {} 方法。
  • 任何默认导出都应作为“import any name”导入。