javascript_include_tag:应用程序在开发环境中加载javascripts两次

时间:2013-12-10 10:04:16

标签: javascript ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 asset-pipeline

这很奇怪......

我布局的head部分中的这行代码:

<%= javascript_include_tag :application %>

此html中的结果:

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-ui.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery.prettyPhoto.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery.qtip.min.js?body=1" type="text/javascript"></script>
<script src="/assets/dataTables/jquery.dataTables.js?body=1" type="text/javascript"></script>
<script src="/assets/datatable-enables.js?body=1" type="text/javascript"></script>
<script src="/assets/modernizr-1.7.min.js?body=1" type="text/javascript"></script>
<script src="/assets/qtips.js?body=1" type="text/javascript"></script>
<script src="/assets/pagination.js?body=1" type="text/javascript"></script>
<script src="/assets/payments.js?body=1" type="text/javascript"></script>
<script src="/assets/replies.js?body=1" type="text/javascript"></script>
<script src="/assets/searches.js?body=1" type="text/javascript"></script>
<script src="/assets/static_pages.js?body=1" type="text/javascript"></script>
<script src="/assets/user.js?body=1" type="text/javascript"></script>
<script src="/assets/gmaps4rails/gmaps4rails.base.js?body=1" type="text/javascript"></script>
<script src="/assets/gmaps4rails/gmaps4rails.bing.js?body=1" type="text/javascript"></script>
<script src="/assets/gmaps4rails/gmaps4rails.googlemaps.js?body=1" type="text/javascript"></script>
<script src="/assets/gmaps4rails/gmaps4rails.mapquest.js?body=1" type="text/javascript"></script>
<script src="/assets/gmaps4rails/gmaps4rails.openlayers.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery.rateit.min.js?body=1" type="text/javascript"></script>
<script src="/assets/feedbacks.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

正如您所看到的,它会为每个javascript资源生成一个调用对已编译的applications.js的调用,当然还包括每个javascript资源

因此,每个javascript被调用两次

这仅在开发环境中发生,而在生产环境中,生成的html恰好只是:

<script src="/assets/application.js?body=1" type="text/javascript"></script>

这是我的application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require jquery.prettyPhoto
//= require jquery.qtip.min
//= require dataTables/jquery.dataTables
//= require datatable-enables
//= require modernizr-1.7.min
//= require qtips
//= require pagination
//= require payments  
//= require replies
//= require searches
//= require static_pages
//= require user
//= require gmaps4rails/gmaps4rails.base 
//= require gmaps4rails/gmaps4rails.bing 
//= require gmaps4rails/gmaps4rails.googlemaps
//= require gmaps4rails/gmaps4rails.mapquest
//= require gmaps4rails/gmaps4rails.openlayers
//= require jquery.rateit.min
//= require feedbacks

我正在驾驶Rails 3.2.13,这是怎么回事?

5 个答案:

答案 0 :(得分:4)

在使用我的Rails应用程序之前,我遇到了同样的问题。包括行

config.serve_static_assets = false
development.rb文件中的

解决了这个问题。 (根据rubyonrails.org,此配置项在开发中默认为true,在生产中默认为false,这就是您在生产中没有遇到此问题的原因。)

此设置决定Rails是否应该为public/目录中的静态断言提供服务。在生产中,Web服务器将处理此任务,因此设置默认为false

您可能需要查看以下帖子:

正如@gertas在这篇文章中所说:

  

config.serve_static_assets = false添加到development.rb会阻止从/public/assets加载文件。

最后,您还可以在http://guides.rubyonrails.org/configuring.html

使用Rails的配置指南

它提供了有关Rails应用程序中配置项的全面说明。

答案 1 :(得分:4)

application.js没有加载两次,但案例是 -

在开发环境中,默认情况下不会预编译资产。 所以你的application.js加载到所有javascripts的末尾。实际上,application.js文件包含运行应用程序所需的所有必需的js文件,如果在此之前没有加载任何文件,它将显示错误。

例如,

我的application.js文件有这个内容

//= require jquery
//= require jquery_ujs
//= require foundation
//= require turbolinks
//= require_tree .

然后它意味着必须首先加载所有这些js文件,然后加载application.js。

但是在生产环境中会发生什么,所有的js文件都是在单个application.js文件中预编译的,你只看到一个文件。

所以,我建议不要担心这个。这是rails 3应用程序在开发环境中的正常行为。

答案 2 :(得分:1)

它不包括application.js两倍。无论您在application.js中包含哪些内容都将在开发环境中引用,并且在application.js中编写的任何JS代码都将在最后application.js次调用中添加。尝试点击application.js参考,你会注意到这一点。

在生产环境中;它只会引用包含所有其他引用文件代码的application.js缩小。

答案 3 :(得分:1)

运行

bundle exec rake assets:clean

这会清除所有预编译的资产,因为您在开发环境中不需要它们(它们通过资产管道提供)。

答案 4 :(得分:0)

从公用文件夹中删除Asset Pipeline文件夹。它默认自动加载该区域的js文件。