我有一个Ruby on rails应用程序,其中80%的页面我都在使用谷歌地图。所以在我的许多单独的JS文件(在资产/javascript中)中,我包含了许多来自谷歌的变量,例如
google.maps.DirectionsStatus
new google.maps.LatLng(a,b)
new google.maps.Marker
google.maps.event.addListener
我已经在我的应用程序中包含了以下脚本.html.erb 在头部部分
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=<%= ENV["GOOGLE_MAP"]%>&sensor=false&libraries=places">
</script>
在我没有使用谷歌地图的页面的生产中,控制台上显示错误
TypeError: a is null
。(null,_.ia)},p$=function(a,b){this.j=a;this.ma=a.value;this.Vd(this.ma);this.V=b...
这会阻止没有谷歌地图的页面中的其他javascript函数运行。本地主机中的所有内容都可以正常工作,顺便说一句,它仅在生产中(带有 ubuntu 的 aws-ec2 服务器。服务器nginx和应用程序服务器美洲狮)它不起作用。我在谷歌地图集成方面出错了吗?有解决此问题的方法吗?
注意:我没有为应用程序使用涡轮链接。
更新:经过进一步测试,只有document.ready函数在此类页面上不起作用。此类页面上的其他 js 函数在生产中运行良好。
隔离 Google 地图 API
从 application.html.erb 中删除 Google 脚本包含。如果您不需要在每个页面上都使用它,请不要在每个页面上加载它。
创建一个部分_map_handler.html.erb(或其他什么)。在顶部,包括您的谷歌地图js:
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=<%= ENV["GOOGLE_MAP"]%>&sensor=false&libraries=places">
</script>
此部分(或任意数量的部分)是放置所有地图(视图)操作的位置。可能不需要说,但所有的谷歌呼叫都必须只在部分。
google.maps.DirectionsStatus
new google.maps.LatLng(a,b)
new google.maps.Marker
google.maps.event.addListener
有两个好处:
- Google 脚本未加载到不需要它的页面上
- 如果您切换到另一个地图 API,则需要更改部分,但您将避免在整个视图中散布 Google 地图代码依赖项。
如果您有自己的 JavaScript 映射处理程序,则必须将映射 js 隔离到其自己的编译资产中。
三个步骤
应用.js
Remove //= require_tree .
影响:您现在必须手动将主资产 glob 中所需的每个 js 文件作为包含行包含在内。这可能会破坏您的资产,但要隔离地图 js,您必须完成此操作。
重要提示:请确保在申请中不包含my_map_handlers.js.js
资产.rb
添加一行以将my_map_handlers.js编译为单独的资产文件
Rails.application.config.assets.precompile += %w( my_map_handlers.js)
_map_handler.html.erb
将您的my_map_handlers js(将通过上述步骤独立编译)包含在谷歌地图 API 之后和任何引用之前的部分
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=<%= ENV["GOOGLE_MAP"]%>&sensor=false&libraries=places">
</script>
<%= javascript_include_tag 'my_map_handlers' %>
用于编译/引用单个资产的官方文档在这里。