ES6 içe aktarma için ne zaman süslü parantez kullanmalıyım?


764

Görünüşe göre, ES6'da tek bir modülü içe aktarmak için kıvırcık parantezlerin ne zaman kullanılacağı konusunda kendimi biraz karışık buldum. Örneğin, üzerinde çalıştığım React-Native projesinde, aşağıdaki dosyaya ve içeriğine sahibim:

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'de, kıvırcık parantez olmadan içe aktarmak zorundayım:

import initialState from './todoInitialState';

initialStateKıvırcık parantez içine alırsanız, aşağıdaki kod satırı için aşağıdaki hatayı alıyorum:

Undefined özelliği todo okunamıyor

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

Kıvırcık parantez ile bileşenlerime de benzer hatalar oluyor. Tek bir içe aktarma için kıvırcık parantezleri ne zaman kullanmam gerektiğini merak ediyordum, çünkü açıkçası, birden fazla bileşen / modülü içe aktarırken, bunları bildiğim kıvırcık parantez içine almanız gerekiyor.

Düzenle:

SO sonrası burada yerine Soruyorum, soruma cevap vermez zaman ben veya ithalatı için kıvırcık parantez gerektiğine tek bu görünüşte değil (modülü, yoksa ES6 tek modül ithalatı için kıvırcık parantez asla durumda, kıvırcık parantez ile tek ithalat gördüğüm gibi)



1
Hayır, farklı. teşekkürler
TonyGW

Yanıtlar:


2263

Bu varsayılan bir içe aktarmadır :

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

Bu, yalnızca çalışır Asahiptir varsayılan ihracat :

// A.js
export default 42

Bu durumda, içe aktarırken hangi adı atadığınız önemli değildir:

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

Her zaman çözecektir Çünkü odur için varsayılan ihracat arasında A.


Bu, şu şekilde adlandırılmış bir içe aktarmadırA :

import { A } from './A'

Yalnızca şu şekilde adlandırılmış bir dışa aktarmaA içeriyorsa çalışır :A

export const A = 42

Bu durumda, belirli bir şeyi dışa aktarma adıyla içe aktardığınız için ad önemlidir :

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

Bu işi yapmak için, bir eklersiniz tekabül adlı ihracat için A:

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

Bir modülün yalnızca bir varsayılan dışa aktarımı olabilir , ancak istediğiniz sayıda adlandırılmış dışa aktarma (sıfır, bir, iki veya çok) olabilir. Hepsini birlikte içe aktarabilirsiniz:

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

Burada, varsayılan olarak ihracat ithalat Ave denilen adında ihracatını myAve Somethingsırasıyla.

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

İçe aktarırken onlara tüm farklı adları atayabiliriz:

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

Varsayılan dışa aktarmalar, modülden normalde almayı beklediğiniz her şey için kullanılır. Belirtilen dışa aktarmalar, kullanışlı olabilecek, ancak her zaman gerekli olmayan yardımcı programlar için kullanılma eğilimindedir. Ancak, bir şeyin nasıl dışa aktarılacağını seçmek size bağlıdır: örneğin, bir modülün varsayılan dışa aktarımı olmayabilir.

Bu, ES modülleri için varsayılan ve adlandırılmış dışa aktarma arasındaki farkı açıklayan harika bir kılavuzdur.


4
Bir modül olan herhangi düşüşünü orada bireysel ihracatını var mı export const myA = 43; export const Something = 44;aynı zamanda iyi tanımlanmış export default { myA, Something }? Yani içe aktardığınızda import A from './A';modüldeki her şey için ya da modülün import { Something } from './A';sadece bir kısmını alabilirsiniz
Michael

12
Bu iyi, ama tek bir nesne haline tüm adlandırılmış ihracatını kapma için bir sözdizimi zaten vardır: import * as AllTheThings.
Dan Abramov

82
Açıkça açıkladı! Keşke bu cevabı iki katına çıkarabilirdim.
Willa

7
buna ne dersiniz- import 'firebase/storage';veya import 'rxjs/add/operator/map';. Aslında ne yapıyor?
kyw

9
@kyw: Bu, modülü yürütür, ancak dışa aktarılan değeri yok sayar. Yan etkiler için kullanışlıdır.
Dan Abramov

84

Ayrıca importsöylemeye değer ES6 anahtar kelime için yıldızlı bir gösterim olduğunu söyleyebilirim .

resim açıklamasını buraya girin

Günlük Mix'i konsollamaya çalışırsanız:

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

Alacaksın:

resim açıklamasını buraya girin

ES6 içe aktarma için ne zaman süslü parantez kullanmalıyım?

Braketler, modülden yalnızca belirli bileşenlere ihtiyacınız olduğunda altındır, bu da web paketi gibi paketleyiciler için daha küçük ayak izleri yapar.


4
Resminiz bu özel cevap için mükemmel bir hile sayfasıdır.
Rodrirokr

1
Are import * as Mix from "./A";ve import A as Mix from "./A";aynı?
Shafizadeh

40

Yukarıdaki Dan Abramov cevabı, varsayılan ihracatlar ve adlandırılmış ihracatlar hakkında açıklıyor .

Hangisi kullanılır?

Alıntı David Herman : ECMAScript 6, tek / varsayılan dışa aktarma stilini tercih eder ve varsayılanı içe aktarmak için en tatlı sözdizimini verir. İsimli ihracatın ithalatı biraz daha az özlü olabilir ve hatta daha az özlü olabilir.

Ancak TypeScript'te yeniden düzenleme nedeniyle dışa aktarma adı verilir. Örneğin, bir sınıfı varsayılan olarak dışa aktarır ve yeniden adlandırırsanız, sınıf adı diğer başvurularda değil, yalnızca bu dosyada değişir; adlandırılmış dışa aktarma sınıfı adı tüm başvurularda yeniden adlandırılır. Kamu hizmetleri için adlandırılmış ihracat da tercih edilir.

Genel olarak ne isterseniz kullanın.

Ek

Varsayılan dışa aktarma aslında varsayılan olarak adlandırılmış bir dışa aktarmadır, bu nedenle varsayılan dışa aktarma şu şekilde içe aktarılabilir:

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

2
AdditionalÇizgi iyi bilgidir. import A from './A'gibi bir ad tanımlamaksızın dışa aktarıyorsanız, bir anlam ifade etmez export default 42.
PGT

8
Lütfen David Herman'ın sözünü yanlış yorumlamadığınızdan emin olun. " ES6'da her zaman tek / varsayılan ihracat kullanmak tercih edilir " değil, " Tek ihracat çok yaygın olduğu için ES6 varsayılanları en iyi şekilde destekler ve onlara en tatlı sözdizimini verdik " anlamına gelmez .
Bergi

15

importDüğüm modülleri, nesneler ve yıkım için sadece sözdizimi şekeri olduğunu düşünüyorsanız, bunun oldukça sezgisel olduğunu düşünüyorum.

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

Kıvırcık parantezlerin importifadelerde kullanımını anlamak için , önce ES6'da tanıtılan yıkım kavramını anlamanız gerekir.

  1. Nesne yok etme

    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. Dizi yıkımı

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

    Liste eşlemeyi kullanma

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

    Forma operatörünü kullanma

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

Şimdi bunu yolumuzdan çıkardığımıza göre , ES6'da birden fazla modülü dışa aktarabilirsiniz. Daha sonra aşağıdaki gibi nesne yıkımından faydalanabilirsiniz

Diyelim ki bir modülünüz var module.js

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

Dışa aktarılan işlevleri içine aktarmak istediğinizde index.js;

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

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

Bunun gibi farklı değişken adları da kullanabilirsiniz

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

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

Yıkımla karşılaştırmalar gösterdiğiniz için, son yorumunuza eşdeğer yıkım karşılaştırmasını ekleyeceğim: import {printFirstname as pFname, printLastname as pLname} from './module.js'eşdeğer:var foo = {printFirstname: 'p_f_n', printLastname: 'p_l_n'}; var { printFirstname:pFname, printLastname: pLname } = foo; pFname('Taylor'); pLname('Swift');
Adam Moisa

vücut geliştirme fanı?
Tushar Pandey

@TusharPandey Ben bir vücut geliştiriciyim
theTypan

1
Herhangi bir ithalat açıklamasında ve ne zaman kıvırcıkları kullanmamaya karşı kullanacağımı düşünüyorum, nesne tahrip etmekten bahsetmiyorsanız, gerçekten en iyi açıklamayı vermiyorsunuz. Yıkımı öğrendikten sonra, neden kıvırcıklığı kullandığımı hiç düşünmedim, sadece sezgisel olarak mantıklıydı.
Eric Bishard

6

Özet ES6modüller:

ihracat:

2 tür ihracatınız var:

  1. Adlandırılmış ihracat
  2. Varsayılan dışa aktarma, modül başına maks. 1

Sözdizimi:

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

İthalat:

İhracat tipi (yani adlandırılmış veya varsayılan ihracatı) nasıl ithalat şey etkiler:

  1. Adlandırılmış bir dışa aktarma için , dışa aktarılan bildirim (yani değişken, işlev veya sınıf) olarak küme parantezlerini ve tam adını kullanmamız gerekir .
  2. Varsayılan dışa aktarma için adı seçebiliriz.

Sözdizimi:

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

İlgilenilen şeyler:

  1. Belirtilen dışa aktarma için dışa aktarma adıyla eşleşen kıvırcık ayraçlarda virgülle ayrılmış bir liste kullanın .
  2. Varsayılan dışa aktarma için kıvırcık parantez olmadan seçtiğiniz bir adı kullanın.

Takma adlar:

Adlandırılmış bir içe aktarmayı yeniden adlandırmak istediğinizde, bu takma adlarla mümkündür . Bunun sözdizimi şudur:

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

Şimdi içe aktardık importantData_1 ancak tanımlayıcı myDatayerine importantData_1.


5

genellikle bir işlevi dışa aktardığınızda {}

if you have export const x 

kullan import {x} from ''

if you use export default const x 

import X from '' Burada kullanmanız gereken X'i istediğiniz değişkenle değiştirebilirsiniz



0

Kıvrık ayraçlar yalnızca dışa aktarma adı verildiğinde içe aktarma için kullanılır. Dışa aktarma varsayılansa, içe aktarma için süslü ayraçlar kullanılmaz.


0

Varsayılan dışa aktarma için içe aktarırken {} kullanmıyoruz.

Örneğin

player.js

export default vx;

index.js

import vx from './player';

index.js resim açıklamasını buraya girin

player.js resim açıklamasını buraya girin

İhracat yaptığımız her şeyi içe aktarmak istiyorsak * resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.