这似乎是显而易见的,但我发现自己有点困惑,什么时候使用花括号导入ES6中的单个模块。例如,在我正在进行的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用花括号括起来,我会得到以下代码行的错误:

无法读取未定义的属性todo

文件TodoReducer.js:

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

类似的错误也发生在使用花括号的组件上。我想知道什么时候我应该为一个导入使用花括号,因为很明显,当导入多个组件/模块时,你必须用花括号将它们括起来,这是我知道的。

Stack Overflow的帖子在这里没有回答我的问题,相反,我在问什么时候我应该或不应该使用花括号来导入单个模块,或者我不应该在ES6中使用花括号来导入单个模块(这显然不是情况,因为我看到过需要花括号的单个导入)。


这是一个默认的导入:

// 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

一个模块只能有一个默认导出,但可以有任意多个命名导出(0个、1个、2个或多个)。你可以把它们一起导入:

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

在这里,我们将默认的导出导入为A,并将命名的导出分别导入为myA和Something。

// 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'

默认导出通常用于您通常期望从模块中获得的任何内容。命名导出通常用于实用程序,这些实用程序可能很方便,但并不总是必要的。然而,如何导出是由您自己决定的:例如,一个模块可能根本没有默认的导出。

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


Dan Abramov的回答解释了默认输出和指定输出。

用哪一种?

引用大卫·赫尔曼的话:

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

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

总的来说,你喜欢什么就用什么。

额外的

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

import {default as Sample} from '../Sample.js';

我想说的是,import ES6关键字也有一个星号符号值得一提。

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

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

你会得到:

什么时候我应该用大括号导入ES6 ?

当您只需要模块中的特定组件时,括号是黄金,这为webpack等捆绑器节省了更小的占用空间。


如果你认为导入只是Node.js模块、对象和解构的语法糖,我发现它非常直观。

// 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';

为了理解import语句中花括号的使用,首先,你必须理解ES6中引入的解构概念

Object destructuring var bodyBuilder = { firstname: 'Kai', lastname: 'Greene', nickname: 'The Predator' }; var {firstname, lastname} = bodyBuilder; console.log(firstname, lastname); // Kai Greene firstname = 'Morgan'; lastname = 'Aste'; console.log(firstname, lastname); // Morgan Aste Array destructuring var [firstGame] = ['Gran Turismo', 'Burnout', 'GTA']; console.log(firstGame); // Gran Turismo Using list matching var [,secondGame] = ['Gran Turismo', 'Burnout', 'GTA']; console.log(secondGame); // Burnout Using the spread operator var [firstGame, ...rest] = ['Gran Turismo', 'Burnout', 'GTA']; console.log(firstGame);// Gran Turismo console.log(rest);// ['Burnout', 'GTA'];

现在我们已经解决了这个问题,在ES6中你可以导出多个模块。然后你可以像下面这样使用对象解构。

让我们假设您有一个名为module.js的模块

    export const printFirstname(firstname) => console.log(firstname);
    export const printLastname(lastname) => console.log(lastname);

你想把导出的函数导入到index.js;

    import {printFirstname, printLastname} from './module.js'

    printFirstname('Taylor');
    printLastname('Swift');

你也可以像这样使用不同的变量名

    import {printFirstname as pFname, printLastname as pLname} from './module.js'

    pFname('Taylor');
    pLanme('Swift');

通常当你导出一个函数时,你需要使用{}。

如果你有

export const x

你使用

import {x} from ''

如果你使用

export default const x

你需要使用

import x from ''

这里你可以把X换成任何你想要的变量。


花括号({})用于导入命名绑定,其背后的概念是解构赋值

关于import语句如何工作的简单演示可以在我自己对类似问题的回答中找到,在javascript导入中何时使用“{}”?


ES6模块概述:

出口:

您有两种类型的导出:

叫出口 默认导出,每个模块最多导出一个

语法:

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

进口:

导出的类型(即命名导出或默认导出)会影响导入内容的方式:

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

语法:

// 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';

感兴趣的事情:

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

别名:

无论何时你想重命名一个命名导入,这是可能的通过别名。语法如下:

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

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


花括号仅用于指定export时的import。如果导出为默认值,则导入时不使用花括号。


对于默认导出,我们在导入时不使用{}。

例如,

文件player.js

export default vx;

文件index.js

import vx from './player';

文件index.js

文件player.js

如果我们想导入我们导出的所有东西,那么我们使用*:


如果文件中有任何默认导出,则不需要在import语句中使用花括号。 如果文件中有多个导出,那么我们需要在导入文件中使用花括号,以便我们可以导入必要的内容。 你可以在下面的YouTube视频中找到使用大括号和默认语句的完全区别。 21. ES6模块。使用导入/导出的不同方式,代码中的默认语法。Es6 | es2015