2013-04-23 91 views
3

我如何使用Bing Maps API和最新版本的RequireJS?遠程腳本網址是:如何在RequireJS中使用Bing Maps API?

http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0

會我剛加入墊片這樣嗎?

require.config({ 
    /* ... */ 
    paths: { 
     'Microsoft.Maps': 'http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0' 
    }, 
    shim: { 
     'Microsoft.Maps': { 
      deps: [], 
      exports: 'Microsoft' 
     } 
    } 
}); 

然後用它在我的模塊,像這樣:

define(['Microsoft.Maps'], function(Microsoft) { 
    /* ... */ 
}); 

我想我的問題是有關如何使用一般命名空間代碼RequireJS。這些文檔沒有涉及我可以找到的任何示例。

回答

6

事實證明,你可以用async插件做到這一點,就像這樣:

define([ 
    'async!http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0!onscriptload' 
], function() { 
    // Microsoft and Microsoft.Maps will be available here 
}); 

async!位告訴RequireJS使用async插件和!onscriptload位告訴它來發送所產生的自動回撥名稱在onscriptload URL參數中。當Bing完成加載所有資產時,它將發回一個JSONP響應,該響應調用參數中async插件提供的任何回調,然後該參數將轉換爲異步加載並隨後供您的模塊使用的資源。

+0

工程就像一個魅力 - 謝謝!我使用這種技術爲Bing的API構建了一個小的AMD包裝器,然後我可以將其導出到其他模塊。 – killthrush 2013-09-19 12:12:11

+0

你如何處理mapcontrol超時的情況。它看起來像是在超時時阻止整個頁面加載。 – Abadaba 2013-09-23 19:55:31

+0

@Abadaba:這不是一個與RequireJS相關的問題,而是一般依賴第三方腳本的問題。由於MS對於如何使用他們的代碼有一些非常嚴格的限制,我甚至不認爲你可以在本地緩存腳本,所以我不知道有一個*好的*解決方案。 – FtDRbwLXw6 2013-09-24 13:39:41

1

在注視有關RequireJS的文檔,我看到這行:

不要在構建墊片配置混合CDN負載。示例場景: 您從CDN加載jQuery,但使用shim配置加載 類似於依賴jQuery的Backbone的股票版本。當您執行 構建時,請務必在構建的文件中內聯jQuery,並且不要從CDN加載 。否則,Backbone將被內聯在構建文件 中,並且它將在加載CDN的jQuery之前執行。這是 ,因爲shim配置只是延遲加載文件,直到加載了 依賴項,但不執行任何自定義的自動換行。 構建完成後,依賴關係已經內聯,shim config 不能延遲執行非define()的d代碼,直到稍後。 define()'d模塊在編譯後可以使用CDN加載的代碼,因爲 他們正確地將它們的源代碼包裝在定義工廠函數中, 不會執行,直到加載依賴關係。所以課程:shim配置 是非模塊化代碼,傳統代碼的一個權宜之計。 define()'d 模塊更好。

參見:http://requirejs.org/docs/api.html#config

微軟加載與第一腳本引用(遞延加載),你應該清楚地避免使用它以另一種方式通過墊片因爲它更像是CDN負載情況下的多個元素。

+0

我們堅持把它作爲一個腳本標籤包含在它的頭部嗎? – Abadaba 2013-08-23 04:24:40