如何在RequireJS中使用Bing Maps API?

时间:2013-04-23 15:21:14

标签: requirejs bing-maps amd

我如何将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一般使用命名空间代码。文档没有涉及我能找到的任何例子。

2 个答案:

答案 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加载案例。