2016-03-19 27 views
4

Yazdığım systemjs + Babel kullanan bazı ES6 kodlarını yüklemeye çalışıyorum.Dinamik System.import?

Kodun çoğunu taşıyan herhangi bir sorunla karşılaşmadım.

function load(src) { 
    System.import(src).then(function() {}); 
} 

src da bağımlılıklar (statik ithalat) sahip olabilen bir dış ES6 modüldür:

Ancak, dinamik olarak böyle bir ES6 modülü yüklemek için gereken bazı kod var.

Bu kodu Webpack'e nasıl yükleyebilirim? Gereksinim ifadesini kullanmaya çalışırsam, Webpack belgelerine göre normal görünen bir UYARI alıyorum.

cevap

2

Web pakette "dinamik yükleme" gibi bir şeyiniz yok (çünkü paketleyicinin tüm modül bağımlılıklarına gitmesi gerekiyor). Neyi başarmak istediğinize en yakın şey (ve web pakette bunu yapmanın doğru yolu) require.ensure - see documentation'u kullanmak olacaktır. olacağını WebPack içine SystemJS kodu dönüm

Tek yönlü:

function load(moduleName) { 
    switch (moduleName) { 
     case 'foo': 
      require.ensure([], require) => { 
       const foo = require('./foo.js'); 
       // do something with it 
      } 
      break; 
     case 'bar': 
      require.ensure([], require) => { 
       const bar = require('./bar.js'); 
       // do something with it 
      } 
      break; 
    } 
} 

Bir yük fonksiyonu enkapsüle yapmanızı öneriyorum her require.ensure (farklı şekilde geri aramalar yönetmek isteyebilirsiniz).

Bir örneği Bu işlemek için little-loader gibi bir kütüphane kullanmayı deneyebilirsiniz here

+0

Ne yazık ki anahtar kullanamıyorum: dosya adı hakkında hiçbir fikrim yok. – user3475757

+0

Dosya adı hakkında neden hiçbir fikrin yok? Bu, WebPack'te anlam ifade etmiyor.WebPack'te dosyalarınızı paketlersiniz, böylece tüm dosyalarınızın dosya sisteminizde olması gerekir. Bu yüzden, kaynak kodunuzda bulunabilmeleri için dosyalarınızı ön tarafa bilmeniz gerekir, değil mi? – egucciar

+0

* "Webpack'te" dinamik yükleme "gibi bir şeyiniz yok (çünkü paketleyicinin tüm modül bağımlılıklarına gitmesi gerekiyor)" *. Bu sadece yanlıştır. 'require.ensure' * gerçek * dinamik yükleme yapar. Dev konsoldaki ağ sekmesini kontrol edin: gerçek ek paket dosyaları için gerçek istekler atılıyor. Bu yapının bütün noktası: Webpack'in [kod bölme] yapmasını sağlamak için (https://webpack.github.io/docs/code-splitting.html). –

1

kontrol edebilirsiniz. Örnek:

var load = require('little-loader'); 

load('<src>', function(err) { 
    // loaded now, do something 
}); 
+0

yapmam gerek. Sanırım bir çeşit kullanmalıyım. Aslında harici loader.Ama betiğin çalışmasının sonucuna ihtiyacım var: Küçük yükleyicinin bunu desteklediğinden emin değilim. – user3475757

+0

Projede bunun hakkında soru sorabilirsiniz. ajax ve 'iframe' tabanlı bir sanal alan içinde 'eval'. sonra oradan sonucunu yakalayın. Bu sizin amaçlarınız için çok fazla olabilir, –

+0

' src'nizin kendi bağımlılıklarına sahip olabilir (statik ithalat), bu çözmek için tamamen önemsiz bir sorun olmayabilir. Yüklemek istediğiniz modülü değerlendirmeye bile başlamadan önce bu ithalatı yüklemeniz gerekir. –

3

WebPack 1 System.import desteklemez, sen WebPack en require.ensure dinamik modülleri yüklemek için kullanarak bu geçici bir çözüm mümkün olabilir. Bu yaklaşımın ayrıntıları burada bulunabilir: https://webpack.github.io/docs/code-splitting.html#es6-modules

yapmak istediğiniz tam olarak ne bağlı olarak, yanı WebPack en context özelliği kullanmak gerekebilir daha fazla bilgi için buraya bakınız https://webpack.github.io/docs/context.html

WebPack 2 Bu sorunları gidermek gerekir ES6 & System.import doğrudan destekleyecek gibi.

8

Önceki cevaplar doğruydu, ancak şimdi webpack 2.2 + babel'de (yazarken, v2.2.0-rc.3 son versiyonudur) bunu yapabiliriz. Kendimi test etmedim, ama beni buraya getiren bir araştırma yaptı.

webpack belgelerinden bunu okuyun:

function route(path, query) { 
 
    return import("./routes/" + path + "/route") 
 
    .then(route => new route.Route(query)); 
 
} 
 
// This creates a separate chunk for each possible route

Eğer Syntax Dynamic Import plugin yüklemeniz gerekir dikkat edin:

Sadece o bölümünün altında Code Splitting with es2015 bu örnekle Dynamic Expressions olduğunu dokümanın da belirttiği gibi.

+0

'Import' SystemMail()' üzerinde tercih edilir mi? – notgiorgi

+0

@ notgiorgi kullanım durumunuz IMO. Sadece bir f ile ve _need_ dinamik olmayacak, sadece 'System.import' webpack yapılarak sadece bir tane daha fazla paket oluşturacak ve yapım sürenizi azaltacaktır. Dinamik 'import' yaparsanız, webpack sizin durumunuzda bulabileceğiniz her potansiyel yol için bir paket oluşturacaktır ve bu da yapının daha uzun sürmesine neden olacaktır. – sic1

+0

Belgelenen davranışı göremiyorum. 'fonksiyonu getStatic() {dönüş alma ("./ bileşen)} ' 'fonksiyonu getDynamic (yol) {geri alma (" ./" + yolu)}' ' getStatic() fine' çalışır // 'getDynamic ('component') // hata atar: Modülü bulamıyor –