【问题标题】:javascript_include_tag :application loads javascripts twice in development environmentjavascript_include_tag :应用程序在开发环境中加载 javascripts 两次
【发布时间】:2013-12-10 10:04:15
【问题描述】:

这很奇怪……

我布局的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,这是怎么回事?

【问题讨论】:

  • 您是否在开发中运行过rake assets:precompile
  • 不这么认为,但无论如何我按照你的建议拨打了bundle exec rake assets:clean
  • @Darmen 不知道你是否已经解决了你的问题。如果没有,您是否尝试将config.serve_static_assets = false 添加到您的development.rb 文件中?
  • 开发中application.js的内容是什么? (严重问题,请在此处发布代码)
  • @Paul,也许config.serve_static_assets = false 解决了这个问题,因为之前(也回复@Michael)application.js 在开发中的内容再次是清单中包含的所有javascript,而现在,总是在开发中,我看到所有对每个 javascript 的调用和以前一样,但 application.js 只包含注释行(从“这是一个清单..”到“在..需要下面。”并且没有 javascript 代码了. 这是正确的行为吗?无论如何,现在每个 javascript 实际上只被调用一次。仍在调查,但问题似乎已解决!

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


【解决方案1】:

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

config.serve_static_assets = false

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

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

你可能想看看这些帖子:

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

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

最后,您还可以使用 Rails 的配置指南http://guides.rubyonrails.org/configuring.html

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

【讨论】:

    【解决方案2】:

    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 应用程序的正常行为。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我知道,我没有得到你的答案。 Application.js 工作正常,问题是,在它之前并且仅在开发中,每个 javascript 文件都有一个调用,我不知道为什么!
      【解决方案4】:

      运行

      bundle exec rake assets:clean
      

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

      【讨论】:

      • 做到了,还指定了开发环境:bundle exec rake assets:clean RAILS_ENV=development 结果:/Users/me/.rbenv/versions/1.9.3-p448/bin/ruby /Users/ me/.rbenv/versions/1.9.3-p448/bin/rake assets:clean:all RAILS_ENV=development RAILS_GROUPS=assets rm -rf /Users/me/dev/rails/myapp/public/assets 但没有任何改变
      【解决方案5】:

      从公用文件夹中删除 Asset Pipeline 文件夹。默认情况下,它会自动从该区域加载 js 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多