使用AMD隐藏全局window.google.maps对象

时间:2014-03-12 15:32:52

标签: javascript google-maps amd

我正在使用AMD模块模式,到目前为止,隐藏本来是全局对象的内容相对简单:

define([], function(){

  /*jquery here */

  var tmp = $;
  $ = undefined;
  return tmp;
}

然而,我很好奇是否可以使用google的全局对象做类似的事情(我猜他们真的很喜欢这些..地图,几乎所有的API都使用em)。

在执行我之前所做的事情实际上会破坏代码,因为。似乎内部谷歌通过从动态加载的脚本调用全局window.google对象来自我引用自身。

我会继续调查但很好奇你们都在想什么!

感谢。

1 个答案:

答案 0 :(得分:1)

如果你使用RequireJS作为你的AMD加载器,你可以使用config shims来包装非AMD模块,表达它们的依赖关系,执行任何必要的初始化(你可以在哪里)清除他们的全局,如果脚本支持它)并导出他们的全局。

对于谷歌地图,这看起来像这样(不,你可能不想清除全球谷歌变量):

require.config({
    paths: {
        "maps": "https://maps.googleapis.com/maps/api/js?key=API_KEY"
    },
    shims: {
        "maps": {
            exports: "google.maps"
        }
    }
});

稍后,您可以将其用作常规AMD模块:

require(["maps"], function(maps) {
   var map = new maps.Map(document.getElementById("map-canvas"), ....);
   ...
});