什么时候应该使用花括号进行 ES6 导入?

IT技术 javascript import ecmascript-6
2021-01-14 01:46:31

这似乎很明显,但我发现自己对何时使用花括号在 ES6 中导入单个module感到有些困惑。例如,在我正在处理的 React-Native 项目中,我有以下文件及其内容:

文件initialState.js

var initialState = {
    todo: {
        todos: [
            {id: 1, task: 'Finish Coding', completed: false},
            {id: 2, task: 'Do Laundry', completed: false},
            {id: 2, task: 'Shopping Groceries', completed: false},
        ]
    }
};

export default initialState;

在 TodoReducer.js 中,我必须在没有花括号的情况下导入它:

import initialState from './todoInitialState';

如果我将 括initialState在花括号中,则会收到以下代码行的以下错误:

无法读取未定义的属性待办事项

文件TodoReducer.js

export default function todos(state = initialState.todo, action) {
    // ...
}

类似的错误也发生在我的带花括号的组件上。我想知道何时应该对单个导入使用大括号,因为显然,在导入多个组件/module时,您必须将它们括在花括号中,我知道这一点。

堆栈溢出后,在这里并没有回答我的问题,而不是我问的时候我应不应该用花括号用于导入单个module,或者我不应该用花括号中ES6导入单个module(这显然不是这种情况,因为我已经看到需要花括号的单个导入)。

6个回答

这是默认导入

// B.js
import A from './A'

它仅在A具有默认导出时才有效

// A.js
export default 42

在这种情况下,导入时分配给它的名称并不重要:

// B.js
import A from './A'
import MyA from './A'
import Something from './A'

因为它会始终解析到任何的是默认的导出A


这是一个名为的命名导入A

import { A } from './A'

它仅在A包含名为 的命名导出A时才有效

export const A = 42

在这种情况下,名称很重要,因为您要通过其导出名称导入特定事物

// B.js
import { A } from './A'
import { myA } from './A' // Doesn't work!
import { Something } from './A' // Doesn't work!

为了使这些工作,你需要添加一个相应的命名导出A

// A.js
export const A = 42
export const myA = 43
export const Something = 44

一个module只能有一个默认的 export,但可以有任意数量的命名导出(零、一、二或多)。您可以将它们全部导入:

// B.js
import A, { myA, Something } from './A'

在这里,我们将默认导出导入为A,命名导出分别称为myASomething

// A.js
export default 42
export const myA = 43
export const Something = 44

我们还可以在导入时为它们分配不同的名称:

// B.js
import X, { myA as myX, Something as XSomething } from './A'

默认导出往往用于您通常期望从module中获得的任何内容。命名导出往往用于可能很方便但并不总是必要的实用程序。但是,您可以选择如何导出内容:例如,module可能根本没有默认导出。

这是一个很好的 ES module指南,解释了默认导出和命名导出之间的区别。

@kyw:这将执行module但忽略导出的值。对副作用有用。
2021-03-14 01:46:31
让一个module具有单独的导出 export const myA = 43; export const Something = 44;以及一个export default { myA, Something }? 因此,当您导入时,您可以import A from './A';对module中的所有内容进行 导入,也可以import { Something } from './A';只获取部分module
2021-04-03 01:46:31
注意:import { A };当你这样时你不能这样const A = 42; export default A;这可能看起来很奇怪,并且在从命名到默认导出重构时可能会破坏你的导入(除非你删除花括号)。我想这有点合乎逻辑(叹气..),因为默认导出只导出一个值,而不是一个名称。The export default Aonly 指的是42引用的值A
2021-04-03 01:46:31
这个 -import 'firebase/storage';import 'rxjs/add/operator/map';. 那实际上在做什么?
2021-04-05 01:46:31
这很好,但已经有一种语法可以将所有命名导出抓取到单个对象中:import * as AllTheThings.
2021-04-08 01:46:31

我想说还有一个import值得一提ES6 关键字的星号符号

在此处输入图片说明

如果您尝试控制台日志 Mix:

import * as Mix from "./A";
console.log(Mix);

你会得到:

在此处输入图片说明

什么时候应该使用花括号进行 ES6 导入?

当您只需要module中的特定组件时,括号是金色的,这使得像 webpack 这样的打包器占用的空间更小。

@PeterMortensen 加星标意味着使用开始符号并从该文件/module导入所有内容
2021-03-10 01:46:31
import * as Mix from "./A";import A as Mix from "./A";一样吗?
2021-03-20 01:46:31
@PeterMortensen 术语星,或星标我相信我使用了“*” thefreedictionary.com/starred星号。那是 3 年前的事了,但我认为就是这样。
2021-04-03 01:46:31
“星号符号”是什么意思外卡
2021-04-07 01:46:31

Dan Abramov 的回答解释了默认的导出命名的导出

使用哪个?

引用 David Herman 的话ECMAScript 6支持单一/默认导出样式,并为导入默认提供了最甜蜜的语法。导入命名导出可以甚至应该稍微不那么简洁。

然而,在 TypeScript 中命名导出由于重构而受到青睐。例如,如果您默认导出一个类并对其重命名,则类名只会在该文件中更改,而不会在其他引用中更改,命名导出类名将在所有引用中重命名。命名导出也是实用程序的首选。

总体使用您喜欢的任何内容。

额外的

默认导出实际上是名称为 default 的命名导出,因此默认导出可以导入为:

import {default as Sample} from '../Sample.js';
Additional行是很好的信息。import A from './A'如果您在没有定义名称的情况下导出,则没有意义export default 42
2021-03-10 01:46:31
请确保不要误解大卫赫尔曼的报价。这并不意味着“在 ES6 中总是倾向于使用单一/默认导出”,而是“因为单一导出如此普遍,ES6 对默认值的支持最好,我们给了它们最甜蜜的语法”。
2021-03-27 01:46:31

如果您import仅将 Node.js module、对象和解构视为语法糖,我会发现它非常直观。

// bar.js
module = {};

module.exports = {
  functionA: () => {},
  functionB: ()=> {}
};

 // Really all that is is this:
 var module = {
   exports: {
      functionA, functionB
   }
  };

// Then, over in foo.js

// The whole exported object:
var fump = require('./bar.js'); //= { functionA, functionB }
// Or
import fump from './bar' // The same thing - object functionA and functionB properties


// Just one property of the object
var fump = require('./bar.js').functionA;

// Same as this, right?
var fump = { functionA, functionB }.functionA;

// And if we use ES6 destructuring:
var { functionA } =  { functionA, functionB };
// We get same result

// So, in import syntax:
import { functionA } from './bar';

ES6module总结

出口:

您有两种类型的导出:

  1. 命名导出
  2. 默认导出,每个module最多一个

句法:

// Module A
export const importantData_1 = 1;
export const importantData_2 = 2;
export default function foo () {}

进口:

导出类型(即命名或默认导出)会影响如何导入:

  1. 对于命名导出,我们必须使用大括号和确切名称作为导出的声明(即变量、函数或类)。
  2. 对于默认导出,我们可以选择名称。

句法:

// Module B, imports from module A which is located in the same directory

import { importantData_1 , importantData_2  } from './A';  // For our named imports

// Syntax single named import:
// import { importantData_1 }

// For our default export (foo), the name choice is arbitrary
import ourFunction from './A';

感兴趣的东西:

  1. 在大括号内使用逗号分隔的列表,并命名导出的导出名称匹配
  2. 使用您选择的不带花括号的名称作为默认导出。

别名:

每当您想重命名命名导入时,这都可以通过aliases其语法如下:

import { importantData_1 as myData } from './A';

现在我们已经导入了importantData_1,但标识符myData不是importantData_1