2015-05-31 71 views
3

ES6模塊系統似乎非常適合統一CommonJs/AMD語法。作爲requireJs/AMD用戶,我想轉換爲ES6模塊(現在使用babel.js)。使用多個基地系統的ES6異步模塊

雖然似乎有一個問題;通過閱讀文檔和教程,似乎沒有可能加載依賴於多個baseurl的模塊包。使用requireJs這是可以解決的使用context領域:

// async dependencies are loaded from http://path/to/domain 
var contextedRequire1 = require.config({ 
    baseUrl: 'http://path/to/domain/js', 
    context: 'mainContext' 
});  

// async dependencies are located on http://path/to/otherdomain 
var contextRequire2 = require.config({ 
    baseUrl: 'http://path/to/otherdomain/js', 
    context: 'pluginContext' 
}); 

contextedRequire1(['main.js'], function(main){ 
    // loaded using http://path/to/domain/js/main.js 
    contextedRequire2(['plugin-lazyloading-deps.js'], function(plugin){ 
    plugin.init(); 
    }); 
}); 

在main.js

define(['main-deps'], function(mainDeps){ 
    // loaded using http://path/to/domain/js/main-deps.js 
}) 

在插件-惰性加載-deps.js

define(['require'], function(require){ 
    // loaded using http://path/to/otherdomain/js/plugin-lazyloading-deps.js 
    if(Modernizr.touch) { 
    require(['hammer'], function(){ 
     // loaded using http://path/to/otherdomain/js/hammer.js 
     hammer.init(); 
    }) 
    } 
}) 

在ES6異步模塊導入這是不可能的,因爲System是一個單身人士

System.baseURL = "http://path/to/domain/js"; 
System.import("main").then(function(main){ 
    // loaded using http://path/to/domain/js/main.js 

    // This will potentially break when main.js tries to load hammer.js from http://path/to/domain/js 
    System.baseURL = "http://path/to/otherdomain/js"; 
    System.import("plugin-lazyloading-deps").then(function(){ /** code **/ }); 
}); 

我的問題是:是否有東西,我已經錯過了(可能繼承系統能夠配置一些的BaseURL)的文檔,或者是這個東西在作品中爲未來的擴展模塊?

+0

加載來自不同域的異步模塊包的用例是幾個團隊在大型站點(主應用程序)內創建子應用程序 - 需要在不需要主應用程序的情況下在不同的域上構建和部署-deployed。 –

回答

1

看起來好像System.js有一個(無證)的方式 - 通過使用擴展系統對象Object.create(System)

var context1 = Object.create(System); 
context1.baseURL = 'http://path/to/otherdomain/js'; 
context1.import('plugin-lazyloading-deps').then(function(m){ 
    m.setSystem(context1); 
    m.initialize(); 
)); 

請注意,在瀏覽器/ nodeJs中實現System對象之前,此方法可能會中斷。但希望在ES6中使用class context1 extends System可以達到同樣的效果。

該實現與requireJs不是100%類似,因爲無法注入當前上下文以異步加載範圍內上下文中的其他模塊(即'require'相關性需要替換爲m.setSystem(..)或類似)。