2013-04-23 68 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