Коли я повинен використовувати фігурні дужки для імпорту ES6?


764

Це здається очевидним, але я трохи заплутався, коли використовувати фігурні дужки для імпорту одного модуля в ES6. Наприклад, у проекті React-Native, над яким я працюю, у мене є такий файл та його вміст:

InitiState.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) {
// ...
}

Подібні помилки трапляються і в моїх компонентах із фігурними дужками. Мені було цікаво, коли я повинен використовувати фігурні дужки для одного імпорту, тому що, очевидно, при імпорті декількох компонентів / модулів ви повинні укладати їх у фігурні дужки, які я знаю.

Редагувати:

Публікація SO тут не відповідає на моє запитання, натомість я запитую, коли я повинен або не повинен використовувати фігурні дужки для імпорту одного модуля, або я ніколи не повинен використовувати фігурні дужки для імпорту одного модуля в ES6 (це, мабуть, не випадку, як я бачив, потрібен один імпорт із фігурними дужками)



1
ні, це інакше. дякую
TonyGW

Відповіді:


2262

Це імпорт за замовчуванням :

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

Модуль може мати лише один експорт за замовчуванням , але стільки іменованих експортів, скільки ви хочете (нуль, один, два або багато). Ви можете імпортувати їх усі разом:

// 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, що пояснює різницю між типовим експортом та названим експортом.


4
Чи є якийсь спад у тому, щоб модуль мав індивідуальний експорт export const myA = 43; export const Something = 44;, а також export default { myA, Something }? Отже, коли ви імпортуєте, ви можете або import A from './A';на все, що знаходиться в модулі, або import { Something } from './A';так ви отримаєте лише частину модуля
Майкл

12
Це прекрасно, але є вже синтаксис для захоплення всіх іменованого експорту в єдиний об'єкт: import * as AllTheThings.
Дан Абрамов

82
Чітко пояснено! Я хотів би, щоб я міг подвоїти цю голову.
Вілла

7
що з цим - import 'firebase/storage';чи import 'rxjs/add/operator/map';. Що це насправді робить?
kyw

9
@kyw: Це виконує модуль, але ігнорує експортоване значення. Корисний при побічних ефектах.
Дан Абрамов

123

TL; DR : фігурні дужки використовуються, якщо ви хочете імпортувати експорт, який не використовується за замовчуванням.

Дивіться відповідь Дана Абрамова вище для більш детальної інформації.


7
Чому ця відповідь сприяє, крім згадування іншої відповіді?
франки

6
Я надсилаю його раніше і редагував його згодом, вибачте за незручності
Даніель Шмідт

Я не намагався бути ривком, я намагався сформулювати це найбільш ввічливо. Я просто подумав, чому саме тут ця відповідь.
франки

2
Я вважаю, що це питання думки, але я вважаю це дуже корисним. Я прокинув вищевказану відповідь, і це підтвердило те, що я вважав, що намагається спілкуватися.
МОРЧАРД

84

Я б сказав, що для importключового слова ES6 варто згадати також позначення зірочкою .

введіть тут опис зображення

Якщо ви спробуєте консолірувати журнал Mix:

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

Ти отримаєш:

введіть тут опис зображення

Коли я повинен використовувати фігурні дужки для імпорту ES6?

Кронштейни золоті, коли вам потрібні лише конкретні компоненти модуля, що робить менші сліди для таких постачальників, як webpack.


4
Ваше зображення є ідеальним шпаргалкою для цієї конкретної відповіді.
Родрірокр

1
Це import * as Mix from "./A";і import A as Mix from "./A";те саме?
Шафізаде

40

Відповідь Дана Абрамова пояснює вище про експорт за замовчуванням та названий експорт .

Який використовувати?

Цитуючи Девіда Германа : ECMAScript 6 надає перевагу стилю експорту одиночного / за замовчуванням та надає найсолодший синтаксис імпорту за замовчуванням. Імпорт названого експорту може і навіть повинен бути трохи менш стислим.

Однак у TypeScript з ім'ям експорт переважний через рефакторинг. Наприклад, якщо ви експортуєте клас за замовчуванням і перейменовуєте його, ім'я класу буде змінено лише у цьому файлі, а не в інших посиланнях, при цьому назване ім'я класу експорту буде перейменовано у всі посилання. Названий експорт також є кращим для комунальних підприємств.

Загалом використовуйте все, що вам зручніше.

Додатковий

Експорт за замовчуванням - це фактично названий експорт з типовим іменем, тому експорт за замовчуванням можна імпортувати як:

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

2
AdditionalЛінія хороша інформація. import A from './A'не має сенсу, якщо ви експортуєте, не визначаючи таке ім’я export default 42.
PGT

8
Будь ласка, переконайтесь, що не неправильно трактуйте цитату Девіда Германа. Це не означає, що " Є перевагу завжди використовувати одиничний / за замовчуванням експорт в ES6 ", а скоріше " Оскільки експорт є настільки поширеним, ES6 найкраще підтримує параметри за замовчуванням, і ми надали їм найсолодший синтаксис ".
Бергі

15

Якщо ви вважаєте, що 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';

9

Щоб зрозуміти використання фігурних дужок у importвисловлюваннях, спочатку ви повинні зрозуміти поняття руйнування, введене в ES6

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

Тепер, коли ми вийшли з цього шляху, в 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');

Оскільки ви показуєте порівняння з руйнуванням, я додав би еквівалент порівняння деструктування до вашого останнього коментаря: import {printFirstname as pFname, printLastname as pLname} from './module.js'еквівалентно:var foo = {printFirstname: 'p_f_n', printLastname: 'p_l_n'}; var { printFirstname:pFname, printLastname: pLname } = foo; pFname('Taylor'); pLname('Swift');
Адам Моїза

вентилятор бодібілдингу?
Tushar Пандей

@TusharPandey Я будівельник
культури

1
Я думаю, що в будь-якому поясненні імпорту та коли використовувати curlys vs не використовувати їх, якщо ви не згадуєте про руйнування об'єктів, ви справді не даєте найкращого пояснення. Після того, як я дізнався про руйнування, я ніколи не замислювався над тим, чому я більше використовую кучеряве, це просто інтуїтивно мало сенс.
Ерік Бішард

6

Резюме ES6модулів:

експорт:

У вас є два види експорту:

  1. Названий експорт
  2. Експорт за замовчуванням, макс. 1 на модуль

Синтаксис:

// 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. Використовуйте назву за вибором без фігурних дужок для експорту за умовчанням.

Псевдоніми:

Кожен раз, коли ви хочете перейменувати імпорт з ім’ям, це можливо через псевдоніми . Синтаксис для цього такий:

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

Зараз ми імпортували, importantData_1 але myDataзамість цього є ідентифікатор importantData_1.


5

Зазвичай при експорті функції потрібно використовувати {}

if you have export const x 

ти використовуєш import {x} from ''

if you use export default const x 

вам потрібно використовувати import X from '' тут, ви можете змінити X на будь-яку змінну, яку ви хочете


4

Фігурні дужки ({}) використовуються для імпортування названих прив'язок, а концепція, що стоїть за ним, деструктує призначення

Просту демонстрацію того, як працює приклад імпорту на прикладі, можна знайти в моїй власній відповіді на подібне запитання на тему: Коли ми використовуємо '{}' в імпорті JavaScript?


1
Ви точно отримаєте мій голос за найкращу коротку відповідь!
Ерік Бішард

0

Фігурні дужки використовуються лише для імпорту, коли імпорт експортується. Якщо експорт за замовчуванням, то фігурні дужки не використовуються для імпорту.


0

Для експорту за замовчуванням ми не використовуємо {} під час імпорту.

напр

player.js

export default vx;

index.js

import vx from './player';

index.js введіть тут опис зображення

player.js введіть тут опис зображення

Якщо ми хочемо імпортувати все, що експортуємо, ми використовуємо * введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.