Rails 3.1 资产 - 奇怪的开发服务

Posted

技术标签:

【中文标题】Rails 3.1 资产 - 奇怪的开发服务【英文标题】:Rails 3.1 Assets - Strange Serving in Development 【发布时间】:2012-01-11 11:28:08 【问题描述】:

我在使用 Rails 3.1 资产管道时遇到了问题。 资产在开发中包含两次:

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

Rails 以某种方式编译并包含 application.js,因此所有脚本都包含两次 - 作为单个文件并在 application.js

生产环境中的预编译资产一切正常。

development.rb

 config.assets.compress = false
 config.assets.debug = true

production.rb

# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false

# Compress both stylesheets and JavaScripts
config.assets.compress = true
config.assets.js_compressor  = :uglifier
config.assets.css_compressor = :scss

config.assets.compile = false
config.assets.digest = true

application.rb

config.assets.enabled = true

【问题讨论】:

试试rake assets:clean。 development 可能仍然为 application.js 提供服务,但它不应该包含所有其他 js 文件。 删除public/assets中的资产后不要忘记清除浏览器缓存。 【参考方案1】:

尝试将以下内容添加到 development.rb:

config.serve_static_assets = false

...然后清除浏览器缓存(根据 cmets 更新

静态资产是指 public/assets 中的预编译资产,这是rake assets:precompile 放置它们的地方。

如果您为它们提供服务,那么公共/资产中存在的任何内容都会覆盖应用/资产中的任何内容。因此,当 js 标签打算识别 app/assets/application.js 时,正在加载 public/assets/application.js。

【讨论】:

它仍然添加了application.js,但它现在是空的。谢谢! rails 3.2 上看到同样的问题,这个修复对我不起作用。 public/assets 中也没有任何内容,因为这是一个全新的项目,我还没有运行 rake assets:precompile。任何想法是如何解决它?我必须在开发模式下使用config.assets.debug = false 才能让我的 javascript 正常运行,但它变得很烦人! 嗯,有趣...这个解决方案似乎可以在应用程序中运行,但只有在我第一次运行 rake assets:precompile 之后。让您想知道为什么它忽略了config.assets.compile = false 行。 @BenScheirman - 我报告了this as a bug to the rails github issues tracker。有人提交了一个拉取请求来修补它,但它还没有被接受。希望它会很快。随意给它+1。 我遇到了与@Batkins (Rails 3.2) 相同的问题,结果是浏览器缓存是问题所在(因为我是 mac 新手,我没有使用 command + shift + R)【参考方案2】:

一旦你摆脱了 /public/assets,你还必须清除浏览器缓存。

【讨论】:

清除 Chrome 中的浏览器缓存为我解决了这个问题。谢谢!【参考方案3】:

这只是给我带来了一个问题。设置以下使应用程序工作,但包括单个 application.js 文件 - 我不希望在开发中:

config.serve_static_assets = false

我之前已经预编译了我的资产(似乎是原因)。

为了修复它,我做了以下操作:

删除之前预编译添加的 public/assets 目录。 运行 RAILS_ENV=development rake assets:clean 清除 tmp/assets 已编辑 app/assets/application.js

只是在我编辑了 application.js 之后,它出现了错误,然后更正了页面中包含的 applciation.js 不是完整的预编译 application.js。

我不确定是否所有这些都需要完成。一路上我也在重新启动我的服务器。

【讨论】:

我认为编辑app/assets/application.js 需要强制浏览器重新加载它(否则会得到 304)。您也可以在删除 public/assets 后清除浏览器缓存。 这个特定的解决方案对我有用。谢谢你。资产管道很酷,但肯定很脆弱。远非交钥匙,但我们会到达那里。 编辑 application.js 是我缺少的步骤 - 谢谢!【参考方案4】:

被这个绊倒了(又一次),--别忘了在你的 //= require 指令的末尾添加一个空白行 application.js

【讨论】:

我最近在硬盘崩溃后不得不重新设置我的开发环境并遇到了这个问题。出于某种原因,在最后一个指令的末尾添加另一个新行修复了它。 我的 application.js 已经有一个空行,但类似于上面的@zarazan,在末尾添加第二个空行修复了它。我还不能确定原因。 这太疯狂了。我添加了白线,问题得到了解决。我删除了这条线......现在它继续工作......【参考方案5】:

我用更少的文件添加了同样的问题。

这里来自documentation:

在开发模式下,资产按顺序作为单独的文件提供 它们在清单文件中指定。

我的解决方案是从application.css.less 中删除*= require_tree . 行,并仅从less 中使用@import "my-styles";

也许您可以使用 javascript 找到类似的解决方案...

【讨论】:

以上是关于Rails 3.1 资产 - 奇怪的开发服务的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.1 资产管道和缓存

Rails 3.1 资产管道供应商/资产文件夹组织

Rails 3.1 资产预编译 - 包括所有 javascript 文件

用于 JavaScript 的 Rails 3.1 资产管道

Rails 3.1 和 jquery-ui 资产

Rails 3.1 资产管道和手动订购的 Javascript 需要