我如何将Bing Maps API与最新版本的RequireJS一起使用?远程脚本URL为:
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一般使用命名空间代码。文档没有涉及我能找到的任何例子。
答案 0 :(得分: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
参数中提供的onscriptload
插件的任何回调,然后转换为异步加载的资源然后可用为你的模块。
答案 1 :(得分:1)
在查看有关RequireJS的文档时,我看到了这一行:
不要在构建中混合使用CDN加载和shim配置。示例场景: 你从CDN加载jQuery但使用shim配置加载一些东西 像Backbone的股票版本依赖于jQuery。当你这样做 构建时,一定要在构建的文件中内联jQuery并且不要加载 它来自CDN。否则,Backbone将在内置文件中内联 它将在加载CDN的jQuery加载之前执行。这是 因为shim配置只是延迟加载文件,直到 加载依赖项,但不执行任何自动包装定义。 构建之后,依赖关系已经内联,shim配置 不能延迟执行非define()'d代码直到以后。 define()'d模块在构建之后可以使用CDN加载的代码,因为 他们正确地将他们的源包装在定义工厂函数中 在加载依赖项之前不执行。所以上课:shim config 是非模块化代码,遗留代码的权宜之计。定义()倒是 模块更好。
请参阅:http://requirejs.org/docs/api.html#config
Microsoft正在使用第一个脚本引用(deffered loading)加载多个元素,您应该明显避免通过垫片以其他方式使用它,因为它更像是CDN加载案例。