Когда следует использовать фигурные скобки для импорта ES6?

это кажется очевидным, но я немного запутался, когда использовать фигурные скобки для импорта одного модуля в ES6. Например, в проекте React-Native, над которым я работаю, у меня есть следующий файл и его содержимое:

initialState.Яш
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.Яш, я должен импортировать его без фигурных скобок:

import initialState from './todoInitialState';

если я приложу initialState в фигурных скобках я получаю следующую ошибку для следующей строки кода:

не удается прочитать свойство todo undefined

Тодоредуктор.Яш:
export default function todos(state = initialState.todo, action) {
// ...
}

подобные ошибки также происходят с моими компонентами с фигурными скобками. Мне было интересно, когда я должен использовать фигурные скобки для одного импорта, потому что, очевидно, при импорте нескольких компонентов/модулей вы должны заключить их в фигурные скобки, которые я знаю.

Edit:

сообщение SO в здесь не ответ на мой вопрос, вместо этого я спрашиваю , когда я должен или не должен использовать фигурные скобки при импортировании один module, или я никогда не должен использовать фигурные скобки для импорта одного модуля в ES6 (это, по-видимому, не так, поскольку я видел одиночный импорт с фигурными скобками)

8 ответов


это импорт по умолчанию:

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

потому что он всегда будет разрешать все, что есть "экспорт" по умолчанию of 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!

чтобы сделать эти работы, можно добавить соответствующий именованный экспорт to A:

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

модуль может иметь только один экспорт по умолчанию, но!--20-->столько названных экспорта, сколько вы хотели бы (ноль, один, два, много). Вы можете импортировать их все вместе:

// 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, объясняющее разницу между экспортом по умолчанию и именованным экспортом.


TL; DR: фигурные скобки используются, если вы хотите импортировать по умолчанию экспорт.

см. ответ Дана Абрамова выше для получения более подробной информации.


Я бы сказал, что для import ES6 ключевое слово стоит упомянуть.

enter image description here

Если вы попытаетесь console log Mix:

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

вы получите:

enter image description here

когда следует использовать фигурные скобки для импорта ES6?

кронштейны золотые когда вам нужны только специфические компоненты от модуля, который делает более небольшие следы для bundlers как webpack.


дан Абрамов ответ выше объясняет о экспорт по умолчанию и названы экспорт.

что использовать?

Цитируя Дэвида Германа: ECMAScript 6 поддерживает стиль экспорта single/default и дает самый сладкий синтаксис для импорта по умолчанию. Импорт именованного экспорта может и даже должен быть несколько менее кратким.

однако в TypeScript с именем export предпочтение отдается из-за рефакторинга. Например, если вы экспортируете класс по умолчанию и переименовываете его, имя класса будет изменяться только в этом файле, а не в других ссылках, с именем exports имя класса будет переименовано во всех ссылках. Именованный экспорт также предпочтителен для утилит.

в целом используйте все, что вы предпочитаете.

дополнительные

экспорт по умолчанию на самом деле именованный экспорт с именем по умолчанию, поэтому экспорт по умолчанию может быть импортирован как:

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

Если вы думаете о import Как только синтаксический сахар для модулей узлов, объектов и деструктурирования, я нахожу его довольно интуитивным.

// 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' // same thing, object functionA and functionB props


// just one prop 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 заявления, во-первых, вы должны понять концепцию уничтожение представил в ЕС6

  1. объект деструктурируется

    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
    
  2. массив деструктурируется

    var [firstGame] = ['Gran Turismo', 'Burnout', 'GTA'];
    
    console.log(firstGame); // Gran Turismo
    

    использование списка соответствия

      var [,secondGame] = ['Gran Turismo', 'Burnout', 'GTA'];
      console.log(secondGame); // Burnout
    

    использование распространение оператор

    var [firstGame, ...rest] = ['Gran Turismo', 'Burnout', 'GTA'];
    console.log(firstGame);// Gran Turismo
    console.log(rest);// ['Burnout', 'GTA'];
    

теперь, когда мы убрали это с нашего пути, в ЕС6 вы можете экспортировать несколько модулей. Затем вы можете использовать объект destructuring, как показано ниже

предположим, у вас есть модуль под названием 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');

вы также можете использовать различные имена переменных, такие как so

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

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

обычно при экспорте функции необходимо использовать {}

if you have export const x 

вы используете import {x} from ''

if you use export default const x 

вам нужно использовать import X from '' здесь вы можете изменить X на любую переменную, которую требуется


фигурные скобки ({}) используются для импорта именованных Привязок, а концепция, стоящая за ним, - деструктурирование присваивания

простая демонстрация того, как оператор import работает с примером, можно найти в моем собственном ответе на аналогичный вопрос в когда мы используем "{ } " в импорте javascript?