【问题标题】:javascript_include_tag inconsistent behaviorjavascript_include_tag 不一致的行为
【发布时间】:2014-01-30 16:12:48
【问题描述】:

在使用 Ruby 2.0 和 Rails 4.0 时,我在资产管道上看到了不同的行为,我不知道为什么。这是它的要点......

我的 ./app/assets/javascripts 文件夹中有一个 application.js.coffee 和 google_analytics.js.coffee 文件。

在我的 app/views/layouts/application.html.haml 中,我有以下两行:

= javascript_include_tag "application"
= javascript_include_tag "google_analytics"

部署到生产环境后,这会在呈现的页面中生成以下内容:

<script src="/assets/application-f15feb4200e0d1db4963a00b28fbe9ca.js"></script>
<script src="/javascripts/google_analytics.js"></script>

请注意,application 包含按预期编译到资产管道中,而 google_analytics 脚本则没有。

在开发模式下,一切都是从资产管道提供的,没有预期的指纹:

<script src="/assets/jquery.js?body=1"></script>
<!-- several other includes suppressed for brevity here -->
<script src="/assets/application.js?body=1"></script>
<script src="/assets/google_analytics.js?body=1"></script>

我还检查了生产部署并注意到google_analytics 没有经过预编译和指纹识别。

编辑:得到下面的 cmets 和答案后,将以下内容添加到 config/environments/production.rb 并尝试另一个部署:

ComingSoon::Application.configure do
  config.serve_static_assets = false
  config.assets.js_compressor = :uglifier
  config.assets.compile = false
  config.assets.digest = true
  config.assets.version = '1.0'

  config.assets.precompile += ['google_analytics.js.coffee']
end

为什么 sprockets 资产管道没有像 application script 那样预编译 google_analytics 脚本并提供它?我该如何解决这个问题?

【问题讨论】:

  • 你是如何检查谷歌脚本没有被预编译的?如果它在您的资产文件夹中并且您有 //= require_tree 。在您的 application.js 中,它肯定应该被编译。
  • 它在 application.js.coffee 中不是必需的,并且作为一般规则,我不做“require_tree”——它是独立的,因为我只想在有条件的生产中包含它包括。即 "= javascript_include('google_analytics") if Rails.env == 'production'" 为了检查它是否没有预编译,我注意到它在 cap 生产部署期间没有为此文件发出消息,但其他资产确实发出了消息,并且我还登录到生产环境检查 public/assets 文件夹,它也不见了。

标签: ruby-on-rails ruby-on-rails-4 sprockets


【解决方案1】:

您可以将 google 脚本添加到 config/environments/production.rb 文件中 config.assets.precompile 设置的预编译列表中。更多内容:What is the purpose of config.assets.precompile?

【讨论】:

  • 根据该 SO 答案的文档..."编译文件的默认匹配器包括 application.js、application.css 和所有不以 js 或 css 结尾的文件:[ /\w+\ .(?!js|css).+/, /application.(css|js)$/ ]" 这应该意味着“google_analytics.js.coffee”应该被自动提取。
  • 如果它不在您的 application.js 清单中,则不会。如果不是,则需要将其添加到预编译列表中。
  • 按照说明将 google_analytics.js.coffee 添加到要预编译的资产列表中,但行为没有改变。
  • capistrano 的预编译资产...正在执行“cd -- /home/deploy/sites/coming_soon/production/app/releases/20140130174823 && RAILS_ENV=production RAILS_GROUPS=assets bundle exec rake assets:precompile” - - 这还不够吗?
  • 解决了!不要在文件名中包含“咖啡”扩展名。设置应为:“config.assets.precompile += ['google_analytics.js']”
【解决方案2】:

需要将 google_analytics 文件添加到预编译列表中:

config.assets.precompile += ['google_analytics.js.coffee', ..]

根据需要添加到您的application.rbproduction.rb

注意:除非您通过直接 requirerequire_tree 在 application.js 清单文件中需要该文件,否则不会编译 js。

【讨论】:

  • 按照说明将 google_analytics.js.coffee 添加到要预编译的资产列表中,但行为没有改变。更新了问题以显示我的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2011-03-19
  • 2012-05-15
  • 2014-11-11
  • 2013-08-21
  • 2011-03-29
相关资源
最近更新 更多