javascript içe aktarma sözdizimi ile parantez kullanma


115

Kitaplıkları içe aktarmak için aşağıdaki sözdizimini kullanan bir javascript kitaplığıyla karşılaştım:

import React, { Component, PropTypes } from 'react';

Yukarıdaki yöntem ile aşağıdakiler arasındaki fark nedir?

import React, Component, PropTypes from 'react';

4
Cevap belgelerde
adeneo

4
Modülden içe aktarılacak üyeler küme ayraçları içine alınır
adeneo


1
Ha. Her zaman ortadan kaldırırsak, bir SO sorusuna muhtemelen "RTFM" ile cevap verilebilir, Jon Skeet bile altıdan daha az rakamlara sahip olabilir. ; ^)
2017

Yanıtlar:


174
import React, { Component, PropTypes } from 'react';

Bu diyor ki:

İçe varsayılan gelen ihracat 'react'adı altında Reactve ithalat adlı ihracatını Componentve PropTypesaynı adlar altında.

Bu, muhtemelen gördüğünüz iki ortak sözdizimini birleştirir

import React from 'react';
import { Component, PropTypes } from 'react';

Birincisi varsayılan dışa aktarmayı içe aktarmak ve adlandırmak için kullanılırken, ikincisi belirtilen adlandırılmış dışa aktarmaları içe aktarmak için kullanılır.

Genel bir kural olarak, çoğu modül ya tek bir varsayılan dışa aktarma ya da adlandırılmış dışa aktarımların bir listesini sağlar. Bir modül varsayılan bir ihracat hem sağlamak için bu biraz daha az olağan olduğu ve adlandırılmış ihracat. Bununla birlikte, en yaygın olarak içe aktarılan bir özelliğin yanı sıra ek alt özelliklerin olduğu durumda, ilkini varsayılan olarak ve kalanlarını adlandırılmış dışa aktarmalar olarak dışa aktarmak geçerli bir tasarımdır. Bu tür durumlarda, importatıfta bulunduğunuz sözdizimini kullanırsınız.

Diğer cevaplar yanlış ve kafa karıştırıcı arasında bir yerdedir, bunun nedeni muhtemelen bu sorunun sorulduğu sırada MDN belgelerinin yanlış ve kafa karıştırıcı olmasıdır. MDN örneği gösterdi

import name from "module-name";

ve name"içe aktarılan değerleri alacak nesnenin adı" dır. Ama bu yanıltıcı ve yanlış; her şeyden önce, "alınacak" yalnızca bir içe aktarma değeri vardır (neden yalnızca "atanmış" veya "başvurmak için kullanılır" demiyorsunuz) nameve bu durumda içe aktarma değeri , modülden varsayılan dışa aktarmadır .

Bunu açıklamanın bir başka yolu da, yukarıdaki içe aktarmanın tam olarak aynı olduğuna dikkat etmektir.

import { default as name } from "module-name";

ve OP'nin örneği tam olarak aynıdır

import { default as React, Component, PropTypes } from 'react';

MDN belgeleri örneği göstermeye devam etti

import MyModule, {foo, bar} from "my-module.js";

ve bunun anlamına geldiğini iddia etti

Bazıları da açıkça adlandırılmış bir modülün tüm içeriğini içe aktarın. Bu myModule, (sic) foove bargeçerli kapsama ekler . Not olduğunu foove myModule.foogibidir, aynı barvemyModule.bar

MDN'nin burada söylediği ve yanlış MDN belgelerine dayanan diğer yanıtların iddia ettiği şey kesinlikle yanlıştır ve spesifikasyonun daha önceki bir sürümüne dayanıyor olabilir. Bunun aslında yaptığı şey

Varsayılan modül dışa aktarımını ve açıkça adlandırılmış bazı dışa aktarmaları içe aktarın. Bu uçlar MyModule, foove bargeçerli kapsam içine. İhracat isimleri foove barvardır değil erişilebilirMyModule olan varsayılan ihracat, tüm ihracatını kapsayan bazı şemsiye.

(Varsayılan modül dışa aktarımı, export defaultsözdizimi ile dışa aktarılan değerdir ve bu da olabilir export {foo as default}.)

MDN dokümantasyon yazarları aşağıdaki formla karıştırılmış olabilir:

import * as MyModule from 'my-module';

Bu my-module, tüm ihracatları içe aktarır ve bunları gibi adlar altında erişilebilir kılar MyModule.name. Varsayılan dışa aktarmaya şu MyModule.defaultadla da erişilebilir , çünkü varsayılan dışa aktarım aslında ada sahip başka bir adlandırılmış dışa aktarmadan başka bir şey değildir default. Bu sözdiziminde, adlandırılmış dışa aktarımların yalnızca bir alt kümesini içe aktarmanın bir yolu yoktur, ancak biri varsa varsayılan dışa aktarım tüm adlandırılmış dışa aktarmalarla birlikte içe aktarılabilir.

import myModuleDefault, * as myModule from 'my-module';

1
Babel from '/path/to/my-module.js', şahsen kullanmama rağmen kabul ediyor from '/path/to/my-module'.
royhowie

5
Bu kadar detaylı bir açıklama ile bu şekilde ithal edilmeleri için nasıl ihraç edildiklerini de eklemelisiniz.
Caio Iglesias

37
import React, { Component, PropTypes } from 'react'

Bu ihraç çekecek { Component, PropTypes }üyeleri 'react'modül ve atamak Componentve PropTypessırasıyla. Reactmodülün defaultdışa aktarımına eşit olacaktır .

Aşağıda torazaburo tarafından belirtildiği gibi , bu aynıdır

import { default as React, Component, PropTypes } from 'react'

hangisinin kısaltması

import { default as React, Component as Component, PropTypes as PropTypes} from 'react'

İşte başka bir örnek ( özete bağlantı ):

// myModule.js
export let a = true
export let b = 42
export let c = 'hello, world!'
// `d` is not exported alone
let d = 'some property only available from default'

// this uses the new object literal notation in es6
// {myVar} expands to { myVar : myVar }, provided myVar exists
// e.g., let test = 22; let o = {test}; `o` is then equal to { test : 22 }
export default { a, b, d }

// example1.js
import something from 'myModule'
console.log(something)
// this yields (note how `c` is not here):
/*
  {
    a : true,
    b : 42,
    d : 'some property only available from default'
  }
*/

// example2.js
import something, { c } from 'myModule'
console.log(something)  // same as above; the `default` export
console.log(c)          // c === 'hello, world!'

// example3.js
import { a, b, d, default as something } from 'myModule'
console.log(a)            // a === true
console.log(b)            // b === 42
console.log(d)            // d === undefined (we didn't export it individually)
console.log(something.d)  // something.d === 'some property...'

İkinci örneği babel ile test ettim:

import test, test3, test2 from './app/lib/queries.js'
console.log(test, test3, test2)

ve bir sözdizimi hatası aldı.

~/code/repo/tutoring $ babel-node test.js
/Users/royhowie/.node/lib/node_modules/babel/node_modules/babel-core/lib/babel/transformation/file/index.js:601
      throw err;
            ^
SyntaxError: /Users/royhowie/code/repo/tutoring/test.js: Unexpected token (1:13)
> 1 | import test, test3, test2 from './app/lib/queries.js'
    |              ^
  2 | 
  3 | console.log(test, test3, test2)
  4 | 

Başvuru için, importMDN'den gelen yeni dokümantasyonu okuyabilirsiniz . Ancak, görünüşe göre teknik incelemeye ihtiyacı var. Dr. Axel Rauschmayer'in blog yazısı şimdilik daha iyi bir referans.


1
Bu, "react" modülündeki dışa aktarmalardan {Component, PropTypes} özelliklerini alacak ve bunları React'e atayacaktır. Bu yanlış. Varsayılan dışa aktarımı React, adlandırılmış dışa aktarmaları Componentve PropTypesaynı ada sahip değişkenlere atar . Ne yazık ki, deneseniz de öğreneceğiniz gibi MDN belgeleri yanlış. Bkz. 2ality.com/2014/09/es6-modules-final.html . Ayrıca, içe aktarma sözdiziminin atamayı bozmakla kesinlikle hiçbir ilgisi yoktur.

3
importO MDN makalesinin revizyon geçmişini gözden geçiren "yeni dokümantasyon " hakkındaki yorumunuzla ilgili olarak, alıntı yaptığınız bölümler, sayfanın ilk yazıldığı bir yıldan daha uzun bir süre önce, modül sözdiziminin yapıldığı bir dönemden bu yana revize edilmemiştir. hızla değişiyor.

1
@torazaburo Daha doğru olması için cevabımı yeniden yazdım.
royhowie

@royhowie Bu örnek için çok teşekkür ederim !! Kelimenin tam anlamıyla, akılsızca etrafta gezinmek için bir saat daha kurtardı ... Sadece bir sorum var. In example3.jsneden yazdırmak vermedi undefinediçin console.log(d)? Bunu yaptığınızdan beri, export default { a, b, d }onu ihraç ettiniz myModule.js.
CapturedTree

2
1290 In @ myModule.js, nota a, bve cayrı ayrı ihraç edildi. Bu, başka bir dosyanın bunları doğrudan içe aktarabileceği anlamına gelir import { a } from 'myModule'. Öte yandan, dyalnızca varsayılan dışa aktarım yoluyla kullanılabilir, bu nedenle başka bir modül ona iki şekilde import thisObjectContainsDefault from 'myModule'erişebilir : ve ona thisObjectContainsDefault.dOR ile import { default as wrapperObject }ve wrapperObject.d. İkinci yaklaşımın yararı, görülebileceği gibi, ayrı ayrı ihraç edilen ürünleri de alabilmenizdir example3.js.
royhowie
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.