2014-11-04 79 views
4

我有一堆在Ember CLI應用程序中定義的模塊,每個模塊都以相同的路徑開始。我想將模塊導入應用程序中的模塊。例如,我可以寫:在Ember CLI中導入動態模塊

import post1 from 'posts/1'; 
import post2 from 'posts/2'; 
import post3 from 'posts/3'; 

export default Em.ObjectController.extend({ 
    posts: Em.A(post1, post2, post3), 
}); 

不過,我不知道該模塊的名稱,因爲他們在創建/命名由預編譯器的飛行。我所知道的是,路徑總是以相同的字符串開頭。在這種情況下,posts

有沒有辦法導入所有以特定路徑開頭的模塊?例如,我該怎麼辦東西類似如下:

import posts from 'posts/*'; 

// or 

registry['posts'].forEach(postId, i) { 
    var path = 'posts/' + postId; 

    import i from path; 
} 

我想找到每個模塊和進口已出口的對象。

我已經通過ES6 module transpiler文檔,但找不到多少。

+0

「預編譯器」的意思是什麼? ember-cli預編譯器 – thecodejack 2014-11-04 05:26:59

+0

'預編譯器'表示作爲一個ember插件編寫的模板預編譯器,該插件操作樹並將JavaScript對象添加爲某些文件擴展名的ES6模塊。 – 2014-11-04 14:58:03

回答

5

ES6規範不允許您使用import關鍵字動態導入模塊。所有使用模塊語法的導入和導出必須靜態完成。但是,它確實提供了可用於動態導入模塊的程序化API。 This article有一個很好的總結(以及對ES6模塊其餘部分的很好的總結)。

我的建議是將Ember的加載器API包裝成符合ES6的包裝器。例如,灰燼,CLI使用require()函數獲取模塊,所以你可以做這樣的事情:

window.System = window.System || {}; 
window.System['import'] = function(moduleName) { 
    return Ember.RSVP.Promise.resolve(window.require(moduleName)); 
} 

// ... 

System.import('my-app/posts/' + postNumber).then(function(postModule) { 
    // ... 
}); 

您也可以直接使用灰燼require()功能,我的方式只是保護您在可能的情況下是灰燼更改其模塊加載器。

+0

感謝您的答案,但無論如何知道什麼可用的模塊進口是?在你的例子中,我不知道'postNumber'的可能選項是什麼。 – 2014-11-05 00:18:10

+1

我已經回答了我自己的問題:'for(var module in window.require.entries){}'。 – 2014-11-05 00:54:56