当我使用谷歌地图时,我对它的实现感兴趣,所以我使用firebug进行检查。
然后我发现它的javascript加载策略非常有趣。以本页为例:
叠加示例
然后当我第一次打开这个页面时,会加载以下js:
https://maps.googleapis.com/maps/api/js?sensor=false
https://maps.gstatic.com/intl/en_us/mapfiles/api-3/9/13b/main.js
https://maps.gstatic.com/cat_js/intl/en_us/mapfiles/api-3/9/13b/%7Bcommon,map,util,poly%7D.js
https://maps.gstatic.com/cat_js/intl/en_us/mapfiles/api-3/9/13b/%7Bonion,geometry%7D.js
但是如果我刷新页面(使用ctrl+f5),就会加载以下js:
https://maps.googleapis.com/maps/api/js?sensor=false
https://maps.gstatic.com/intl/en_us/mapfiles/api-3/9/13b/main.js
尽管页面仍然有效,但覆盖图已绘制在地图中。但是poly.js等在哪里?
另外,有人能告诉我如何通过组件加载js吗?例如,示例中的common
util
poly
。
当我编写不同的组件时,我应该知道什么?
1.加载poly.js时,它会将一个字符串传递给google.maps.__gjsload___
。
摘录如下:
google.maps.__gjsload__('common', ''use strict';var Ai=isNa...
文件的其余部分只是该字符串的内容。
我的直觉是,这个函数可能会将这个字符串存储在localStorage
或sessionStorage
中,这样它只需要检索一次。
2.此外,如果您想了解如何根据需要加载js文件,请查看AMD和/或CommonJS:模块。
AMD的一个很好的实现(我更喜欢)是RequireJS。
更新
我翻了一下,localStorage
和sessionStorage
似乎没有在这个页面上使用。我也不能重复你的结果。在Firebug中,poly.js总是为我加载。可能某个地方发生了一些魔法,但我没有看到。
但是,完全可以在localStorage
和sessionStorage
中存储字符串以供检索,而不必进行额外的js调用。
另外,有人能告诉我如何通过组件加载js吗?
这涉及到异步javascript文件加载的主题。如果您曾经使用过一种能够在脚本中的任何位置"包含"文件的语言,那么您就会明白javascript没有这种功能。正因为如此,才有了通过脚本标记注入的"aysncjavascript添加"的整个范例。
脚本标记注入:动态生成一个脚本标记,并将其源设置为所需的文件,然后将该标记插入DOM,瞧,一个新文件已经加载并执行。对于javascript繁重的应用程序,这种情况很常见,尤其是在加载第三方应用程序时。谷歌一直都在做这件事,看看谷歌分析的include脚本就知道了。
现在,由于这是一种敏感而微妙的编码类型,一些"javascript组件/模块/资产加载"框架对其进行了改进,使其非常稳定。common.js、require.js等都在这方面做得很好。
当我编写不同的组件时,我应该知道什么?
对于你在谷歌地图上做什么,你真的不需要知道太多。但是,如果你进入javascript模块模式开发,你需要知道这一点:确保你保护你的全局命名空间不被你自己的变量弄得一团糟,所以尽可能将你的所有工作封装在闭包中,并(建议但不要求)用;
启动它们,这样它们在加载不正常时不会相互破坏。