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

mat*_*y-d 5 javascript google-maps amd

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

define([], function(){

  /*jquery here */

  var tmp = $;
  $ = undefined;
  return tmp;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

小智 1

如果您使用RequireJS作为 AMD 加载程序,则可以使用配置填充程序来包装非 AMD 模块,表达它们的依赖关系,执行任何必要的初始化(如果脚本支持,您可以清除它们的全局)并导出它们的全局。

对于 Google 地图,这看起来像这样(不,您可能不想清除全局 google 变量):

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

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

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