Kiedy należy używać curly szelki do ES6 import?

Wydaje się to oczywiste, ale znalazłem się trochę zdezorientowany, kiedy używać curly szelki do importowania pojedynczego modułu w ES6. Na przykład, w projekcie React-Native, nad którym pracuję, mam następujący plik i jego zawartość:

stan początkowy.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;

W TodoReducer.js, muszę go zaimportować bez kręconych szelek:

import initialState from './todoInitialState';

Jeśli załączam initialState w nawiasach klamrowych, otrzymuję następujący błąd dla następującej linii kodu:

Nie można odczytać właściwości todo of undefined

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

Podobne błędy zdarzają się również moim komponentom z klamrami kręconymi. Zastanawiałem się, kiedy powinienem użyć klamry curly do pojedynczego importu, ponieważ oczywiście, podczas importowania wielu komponentów / modułów, trzeba je załączyć w klamry curly, co wiem.

Edit:

Post SO w tutaj nie odpowiada na moje pytanie, zamiast tego pytam kiedy powinienem lub nie powinienem używać klamr do importowania W ES6 nie powinno się używać klamr curly do importowania pojedynczego modułu (widocznie tak nie jest, ponieważ widziałem pojedynczy import z klamrami curly)

Author: Mowzer, 2016-04-22

8 answers

To jest domyślny import:

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

Działa tylko wtedy, gdy A mA domyślny eksport :

// A.js
export default 42

W tym przypadku nie ma znaczenia, jaką nazwę przypisujesz do niego podczas importowania:

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

Ponieważ zawsze będzie rozdzielać się na dowolny domyślny eksport z A.


To jest nazwa import o nazwie A:

import { A } from './A'

Działa tylko wtedy, gdy A zawiera o nazwie export A:

export const A = 42

W tym przypadku nazwa ma znaczenie, ponieważ importujesz konkretną rzecz po jej nazwie eksportowej :

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

Aby te zadziałały, należy dodać odpowiadającą nazwie export do A:

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

Moduł może mieć tylko jeden domyślny eksport , ale tyle nazwanych eksportów, ile chcesz (zero, jeden, dwa lub wiele). Możesz zaimportować je wszystkie razem:

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

Tutaj importujemy domyślny eksport jako A, oraz nazwanych eksportów odpowiednio myA i Something.

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

Możemy również przypisać im wszystkie różne nazwy podczas importowania:

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

Domyślny eksport jest zazwyczaj używany do tego, czego normalnie oczekujesz od modułu. Nazwy eksportu są zazwyczaj używane dla narzędzi, które mogą być przydatne, ale nie zawsze są konieczne. Jednak to do ciebie należy wybór sposobu eksportu rzeczy: na przykład moduł może nie mieć domyślnego eksportu w wszystkie.

Jest to świetny przewodnik po modułach ES, wyjaśniający różnicę między eksportem domyślnym i nazwanym.

 1380
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 15:08:59

TL; DR: nawiasy klamrowe są używane, jeśli chcesz zaimportować niestandardowy eksport.

Zobacz odpowiedź dana Abramovsa powyżej, aby uzyskać więcej szczegółów.

 85
Author: Daniel Schmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 14:50:45

Powiedziałbym, że istnieje również zapis gwiazdkowy dla słowa kluczowego import ES6, o którym warto wspomnieć.

Tutaj wpisz opis obrazka

If you try to console log Mix:

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

Otrzymasz:

Tutaj wpisz opis obrazka

Kiedy należy używać curly braces do importu ES6?

Nawiasy są złote, gdy potrzebujesz tylko określonych komponentów z modułu, co sprawia, że mniejsze footprinty dla bundlerów, takich jak webpack.

 52
Author: prosti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 00:19:11

Dan Abramov odpowiedź powyżej wyjaśnia o domyślnych eksportach i nazwanych eksportach .

Którego użyć?

cytując Davida Hermana : ECMAScript 6 faworyzuje pojedynczy / domyślny styl eksportu i daje najsłodszą składnię importowania domyślnego. Importowanie nazwanego eksportu może, a nawet powinien być nieco mniej zwięzły.

Jednak w maszynopisie o nazwie export jest preferowany ze względu na refaktoryzację. Przykład, jeśli domyślnie eksportujesz klasę i zmieniasz nazwę to, nazwa klasy zmieni się tylko w tym pliku, a nie w innych referencjach, z nazwanym eksportem nazwa klasy zostanie zmieniona we wszystkich referencjach. Eksport nazw jest również preferowany dla narzędzi.

Ogólnie używaj, co chcesz.

Dodatkowe

Default export jest w rzeczywistości nazwanym eksportem z name default, więc default export może być importowany jako:

import {default as Sample} from '../Sample.js';
 31
Author: Deepak Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 06:21:57

Jeśli myślisz o import jako o cukrze składniowym dla modułów węzłów, obiektów i destrukcji, uważam, że jest to dość intuicyjne.

// 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
Author: Brandon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 03:44:58

Aby zrozumieć użycie nawiasów klamrowych w wypowiedziach import, najpierw trzeba zrozumieć pojęcie destrukcji wprowadzone w ES6

  1. Destrukcja obiektów

    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. Destrukcja tablicy

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

    Using list matching

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

    Używając operatora spreadu

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

Teraz, gdy mamy to z drogi, w ES6 możesz eksportować wiele modułów. Następnie możesz użyć destrukcji obiektów, jak poniżej

Załóżmy, że masz moduł o nazwie module.js

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

Chcesz zaimportować wyeksportowane funkcje do index.js;

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

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

Można również używać różnych nazw zmiennych jak tak

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

    pFname('Taylor');
    pLanme('Swift');
 1
Author: theTypan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 08:33:07

Zazwyczaj podczas eksportowania funkcji musisz użyć {}

if you have export const x 

Używasz import {x} from ''

if you use export default const x 

Musisz użyć import X from '' tutaj możesz zmienić X na dowolną zmienną

 1
Author: jadlmir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 14:43:09

Nawiasy klamrowe ({}) są używane do importowania nazwanych wiązań i koncepcją stojącą za nimi jest przypisanie destrukcji

Prosta demonstracja działania instrukcji import na przykładzie znajduje się w mojej własnej odpowiedzi na podobne pytanie pod adresem kiedy używamy '{ }' w importach javascript?

 0
Author: Samuel J Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 19:20:36