3

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

4

2 回答 2

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位告诉它在onscriptloadURL 参数中发送自动生成的回调名称。当 Bing 加载完所有资产后,它将返回一个 JSONP 响应,该响应调用async插件在onscriptload参数中提供的任何回调,然后将其转换为异步加载的资源,然后可用于您的模块。

于 2013-08-08T14:32:02.023 回答
1

在查看有关 RequireJS 的文档时,我看到了这一行:

不要在构建中混合 CDN 加载和 shim 配置。示例场景:您从 CDN 加载 jQuery,但使用 shim 配置加载依赖于 jQuery 的 Backbone 的库存版本。进行构建时,请确保在构建文件中内联 jQuery,并且不要从 CDN 加载它。否则,Backbone 将内联在构建的文件中,并在加载 CDN 的 jQuery 加载之前执行。这是因为 shim 配置只是延迟加载文件,直到加载依赖项,但不执行任何自动包装定义。构建后,依赖项已经内联,shim 配置不能延迟执行未定义()的代码,直到以后。定义()' d 模块在构建后确实与 CDN 加载的代码一起工作,因为它们正确地将其源代码包装在定义工厂函数中,该函数在加载依赖项之前不会执行。所以教训:shim config 是非模块化代码、遗留代码的权宜之计。定义()的模块更好。

请参阅:http ://requirejs.org/docs/api.html#config

Microsoft 正在使用第一个脚本引用(延迟加载)加载多个元素,您应该清楚地避免通过 shim 以另一种方式使用它,因为它更像是 CDN 加载案例。

于 2013-04-23T20:41:42.893 回答