2012-08-28 53 views
1

我們有一個應用程序,使用require.js,同時允許擴展,並且這些擴展的js從不同的路徑獲得服務。因此,在我們的配置,我們有:動態加載混合基址下的require.js模塊

var require = { 
    baseUrl : '/app/js/modules/' 
} 

但擴展從/extension/foo-extension/js/modules/服務。 此外,擴展是動態的,他們將一些html注入到使用data-module="foo/bar"的頁面中,該頁面用於加載該模塊。

理想情況下,我們可以通過/設置require.js的上下文,該範圍將以下模塊加載到baseUrl /extension/foo-extension/js/modules/中。據我所知,我們需要做require('/extension/foo-extension/js/modules/foo/bar')從foo-extension加載foo/bar

下面是一些僞代碼想象,我們需要處理設置路徑/背景:

define(['some-dep'], function(SomeDep) { 
    $.get('somepage', function(html) { 
     var extension = html.data('extension'); // "foo/bar" 
     var extensionBase = html.data('extensionBase'); // extension/foo-extension/js/modules/ 

     // This is where we need to readjust require to use the base path for any foo module 
    }); 
}); 

是否有從去絕對路徑路由另一個解決這個部分?

回答

2

這聽起來像你想要使用"paths" configuration option。例如:

var require = { 
    baseUrl : '/app/js/modules', 
    paths : { 
    'extension' : '/extension/foo-extension/js/modules' 
    } 
}; 

然後,你可以簡單地調用require('extension/foo/bar')加載/app/js/modules/extension/foo-extension/js/modules/foo/bar.js

+0

請注意這裏的* dynamic *位。我無法使用路徑,因爲這是在我的配置設置完成後發生的。如果以某種方式插入路徑,我可以使用'/ extension/{extension}/js/modules /'。 – Nervetattoo

+0

「理想情況下,我們可以爲require.js傳遞/設置一個上下文,以便將以下模塊加載到baseUrl中......」這正是路徑選項的作用。如果您需要動態的服務器端解決方案,我可以建議發佈服​​務器端發生的情況的描述嗎? – Russ

+0

這是設置預定義的路徑。我們從通過稍後通過ajax請求加載的標記中的數據屬性中選擇此路徑。這是我們用我們的路徑吐出require.js配置後的方式。我更新了一些更僞代碼的問題... – Nervetattoo

4

requirejs.config(),供以後調用,在任何時間,裝載機將CONFIGS融合在一起。所以它應該足以等待,直到你知道你想用什麼路徑配置'extension',然後通過另一個requirejs.config()調用來設置它,然後用該路徑加載擴展。