在 Rails 生产中禁用资产缩小

Posted

技术标签:

【中文标题】在 Rails 生产中禁用资产缩小【英文标题】:Disable Asset Minification in Rails Production 【发布时间】:2012-03-29 07:17:29 【问题描述】:

为了在我的 heroku 生产环境中调试 javascript,我需要禁用资产压缩(或至少 javascript 的压缩)。我尝试了config.assets.compress = falseconfig.assets.debug = true,仍然使用压缩资产。然后我删除了压缩资产,此时根本没有渲染任何资产。我添加了config.assets.enabled = false,但没有帮助。我尝试将未压缩的资产复制到各种目录中,包括应用程序根目录、公共和公共/资产(后两者同时使用文件夹“images”、“javascripts”和“stylesheets”,并将资产直接放入文件夹中三个子文件夹)。我最终能够通过更改 html 以直接引用所有 javascript 文件来使 javascripts 工作。但 CSS 和图像仍然无法正常工作。

我原以为我原来的config.assets.compress = false 应该可以工作。任何想法我做错了什么?

【问题讨论】:

你确定是在修改config/environments/production.rb 您是否使用 Rails 标签助手来访问资产(javascript_include_tag 'script.js')?您能否专注于单个文件,并举例说明它是如何实现的以及发生了什么? 【参考方案1】:

我在阅读the docs 后想出了这个解决方法:

在此处创建一个不压缩 js/css 的模块:lib/modules/no_compression.rb

class NoCompression
  def compress(string)
    # do nothing
    string
  end
end

将您的资产配置为(不)使用您的无操作压缩器进行压缩

config.assets.compress = true
config.assets.js_compressor = NoCompression.new
config.assets.css_compressor = NoCompression.new

【讨论】:

非常聪明!我永远不会想到这一点。谢谢! 部署到登台服务器时非常有用。每次在 heroku 上部署时,总共节省了 260 秒,为我节省了 100 秒。 这还会将哈希添加到资产文件名吗?我必须在服务器上调试一些代码,但为了找到错误,我需要使用正确散列的资产名称。 @Ziggy 很抱歉回复晚了,但 Sprockets 仍会附加从未压缩文件的 MD5 哈希创建的摘要(只要在您的 environment.rb 文件中添加config.assets.digest = true 删除 config.assets.js_compressor = :uglifier 就可以修复它【参考方案2】:

在 Rails 4 下只是注释掉这一行

# config.assets.js_compressor = :uglifier

config/environments/production.rb 为我工作。看起来默认是没有压缩。

【讨论】:

【参考方案3】:

我还需要调试我的 js,所以我尝试了 ncherro 的解决方案。问题是它仍然会抛出

rake 中止! 未初始化的常量 NoCompression

所以我只是将 NoCompression 类放在 production.rb 文件中

    # Compress JavaScripts and CSS
    class NoCompression
         def compress(string)
             # do nothing
             string
         end
     end

     config.assets.compress = true
     config.assets.js_compressor = NoCompression.new
     config.assets.css_compressor = NoCompression.new

【讨论】:

您可以使用 require 语句 require 'modules/no_compression.rb' 在 production.rb 文件中包含 no_compression.rb【参考方案4】:

注释掉 uglifier 并添加 config.assets.debug = true。这对我有用。

压缩 JavaScript 和 CSS:

config.assets.js_compressor = :uglifier

调试模式禁用资产的串联和预处理。但此选项可能会导致大量复杂资产的视图渲染出现明显延迟:

config.assets.debug = true

【讨论】:

【参考方案5】:

另外值得注意...除了 ncherro 解决方案之外,您还需要执行以下操作:

    确保将新模块放在默认加载的位置。在我的情况下是 lib/extras。 运行 rake assets:clean 清理现有资产。 运行 rake assets:precompile 以使用新的压缩器编译您的资产。 重新启动您的应用程序...我使用touch tmp/restart.txt

调试愉快 ;)

【讨论】:

【参考方案6】:

使用 Heroku 上的 Rails 4,您需要做两件事。首先正如@geekQ 提到的,注释掉config/environments/production.rb 中的js_compressor 行

# config.assets.js_compressor = :uglifier

其次,你需要考虑Heroku's asset pipeline cache for Rails 4.任何与缓存中版本相同MD5的文件都不会被重新编译。将提供以前的(可能是压缩的)版本。您编辑的任何文件都会有一个新的 MD5 并被重新编译。

您还可以使用 Heroku Repo plugin 将整个资产缓存清除到 Heroku 工具带。安装它,然后使用命令

heroku repo:purge_cache

清除缓存后部署新版本,您的所有资产都将重新编译。

【讨论】:

删除 config.assets.js_compressor = :uglifier 就可以修复它【参考方案7】:

我必须更新 config/initializers/assets.rb 中的 Rails.application.config.assets.version 才能使 production.rb 更改生效。

【讨论】:

【参考方案8】:

environments/production.rb中找到并注释掉这些行:

config.assets.js_compressor = ...
config.assets.css_compressor = ...

【讨论】:

【参考方案9】:

看起来这可能是 Rails 中的一个错误。从即将发布的 rails 3.2.9 的更新日志中,您遇到了这样的问题吗?

尊重资产路径的 config.digest = false

以前,asset_path 内部仅尊重 :digest 选项,但忽略了全局配置设置。这意味着 config.digest = false 不能与 config.compile = false 一起使用,这可以纠正这种行为。

http://weblog.rubyonrails.org/2012/10/29/ann-rails-3-2-9-rc1-has-been-released/

你认为这可能相关吗?

【讨论】:

我认为这两者没有关系,因为我认为更改与是否在资产名称中添加摘要有关,而我的问题更多与 javascript 有关压缩。我想 config.asset.compression 可能存在同样的问题,他们只是还没有找到它。无论如何,感谢您对此的提醒。

以上是关于在 Rails 生产中禁用资产缩小的主要内容,如果未能解决你的问题,请参考以下文章

rails - 在生产模式下找不到 application.css 资产

Rails 应用程序在生产环境中不提供 JS 和 SCSS 资产

Rails 不会在生产模式下加载我的图像资产

在 Rails 4 生产环境中找不到资产的 404 错误

Rails 5生产资产管道CSS未呈现

Rails 4 - 在生产服务器上预编译资产后没有 manifest.json