【问题标题】:Rails. Large vendor.js?导轨。大型 vendor.js?
【发布时间】:2013-02-17 12:56:57
【问题描述】:

我的 rails 项目中有 vendor.js 文件,其中包含几个供应商库,在添加一些新库后,我在开发环境中遇到了这个问题

Started GET "/assets/vendor.js" for 10.40.129.65 at 2013-03-03 14:01:24 +0400
Cache write: 0d6281da1957dd9c5e063fb636c50bd260dae5e2
Cache read: 0d6281da1957dd9c5e063fb636c50bd260dae5e2
Cache read: http://work:3000/assets/vendor.js?
Cache write: http://work:3000/assets/vendor.js?
!! Rack application returned nil body. Probably you wanted it to be an empty string?
!! Unexpected error while processing request: undefined method `each' for nil:NilClass

尝试删除一些库可以解决问题,并且预编译资产可以正常工作。但我想让它在开发中工作。请帮帮我。

vendor.js:

//= require ./vendor/ext/stacktrace.js
//= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require twitter/bootstrap
//= require js_notifier
//= require ./vendor/ext/mustache-1.4.2
//= require ./vendor/ext/strftime
//= require ./vendor/ext/moment
//= require ./vendor/ext/langs.js
//= require ./vendor/ext/jquery.jgrowl_minimized.js
//= require ./vendor/ext/jquery-ui-1.10.0.custom.min.js
//= require ./vendor/ext/jquery-ui-sliderAccess.js
//= require ./vendor/ext/jquery-ui-timepicker-addon.js
//= require ./vendor/ext/backbone.paginator.js
//= require ./vendor/ext/jquery-deparam.min.js
//= require ./vendor/ext/select2.js
//= require_tree ./templates
//= require ./vendor/channels.js.coffee
//= require ./vendor/ext/bootstrap.switch.js
//= require ./vendor/ext/private_pub
//= require ./vendor/ext/spin.js
//= require ./vendor/ext/jquery.spin.js

我正在使用 Memcached + Dalli

更新: 我已经在每个环境中明确设置了 cache_store(developemnt.rb、production.rb 和 test.rb),这解决了这个问题,直到我打开谷歌浏览器再次出现问题。结果,在 FF 中一切正常,Chrome 无法加载 vendor.js(相同的服务器实例(瘦),并且两个浏览器同时加载)

ff 请求的日志:

Cache read: http://work:3000/assets/vendor.js?
Cache read: 577d6ed0d98975b583329c312bd25667620f2497

chrome 请求的日志(同上):

Started GET "/assets/vendor.js" for 10.40.129.65 at 2013-03-03 20:37:11 +0400
Cache write: 577d6ed0d98975b583329c312bd25667620f2497
Cache read: 577d6ed0d98975b583329c312bd25667620f2497
Cache read: http://work:3000/assets/vendor.js?
Cache write: http://work:3000/assets/vendor.js?
!! Rack application returned nil body. Probably you wanted it to be an empty string?
!! Unexpected error while processing request: undefined method `each' for nil:NilClass

【问题讨论】:

  • 你的缓存存储是什么?
  • 你是什么config.cache_store
  • config.cache_store = Rails.env.test? ? :null_store : :dalli_store
  • !! Rack application returned nil body. Probably you wanted it to be an empty string? 通常发生在null_store
  • 我已将缓存存储更改为config.cache_store = :dalli_store,它似乎可以工作,但为什么它试图在开发环境中使用null_store?

标签: ruby-on-rails caching asset-pipeline assets


【解决方案1】:

您可以考虑应用index.js 技术,如this Rails guide (2.1.2) 中所述。尝试拆分您的大文件并将这些部分包含在清单文件中,例如:

在您的/app/vendor/assets/javascripts 中创建一个新目录my_libraries 并将零件放入其中。然后在同一目录中创建 index.js 清单文件并正常包含文件:

//= require file1
//= require file2

在您的application.js 中:

//= require my_libraries

编辑:一种解决方案是:在您的 /vendor/ext 中(正确的路径是 app/vendor/assets/javascripts/ext,如果您有类似 /vendor/ext 的路径,则不清楚它是否应该作为资产目录进行管理,而且不清楚您包含什么资产 - js 或 css)来创建 index.js 内容:

//= require_tree .

在application.js:

//= require ext

然后您应该从您的 application.js 清单中删除对 vendor 目录的所有引用。另一个错误是在清单中包含带有.js 前缀的文件。在清单文件中,您应该声明不带前缀的包含。

查看解释 require_tree 用法的资产管道文档。

【讨论】:

  • 不,vendor.js 位于 app/assets/javascript/ 中。毕竟,如果我从 vendor.js 中删除一些库(例如 EJS 模板),这个解决方案效果很好
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多