【问题标题】:Why does Rails duplicate assets when using yield?为什么 Rails 在使用 yield 时会重复资产?
【发布时间】:2013-02-19 16:50:09
【问题描述】:

我已阅读并尝试了此处 (Ruby On Rails 3.1 - assets pipeline - assets rendered twice) 针对 Rails 中的重复资产问题的解决方案,但它不适用于我的场景,如下所示:

布局:

<!DOCTYPE html>
<html>
<head>...</head>
<body>
...
<!-- including :application -->
<%= javascript_include_tag :application %>
<!-- yielding :body_script -->
<%=  yield :body_script %>
</body>
</html>

然后,在“用户”视图中:

<%= content_for :body_script do %>
    <%= javascript_include_tag 'users' %>
<% end %>
...
...
...

我的 javascript 依赖项是:

  • application.js “需要”jquery、bootstrap 和 self
  • users.js“需要”worker_interface.js
  • worker_interface.js“需要”jquery、knout 和应用程序

渲染“用户”视图时,我的正文末尾出现重复的 jquery 和 application.js,其中一个由于 javascript_include_tag :application 而被渲染,另一个因为yield :body_script,像这样:

<!-- including :application -->
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/bootstrap.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>
<!-- yielding :body_script -->
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/knockout.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>
<script src="/assets/worker_interface.js?body=1" type="text/javascript"></script>
<script src="/assets/users.js?body=1" type="text/javascript"></script>

我知道我在这里有多余的依赖项,因为我要求不止一次(间接地)包含 jquery 和应用程序。但是,Rails 不应该保证不会呈现重复文件吗? 我是否仍然可以保留“冗余”依赖项并只渲染一次文件

顺便说一句,我使用的是 Rails 版本 3.2.9。

【问题讨论】:

  • 您在 application.js 中使用require_tree 吗?人们告诉我,Rails 足够聪明,不会多次包含给定资产,但我一次又一次地看到完全相反的情况。资产管道可能是一件神秘的事情。另一件值得关注的事情是你是否有一些已经预编译的资产。我注意到有时我的开发环境会同时加载非静态和静态资产,可能是配置设置。
  • 嘿@Cyle,我没有在任何地方使用require_tree。我已经用“config.serve_static_assets = false”禁用了静态资产的服务:(
  • 我假设 sadface 意味着它不起作用;)。更改该设置后您重新启动了服务器吗?如果您在本地进行测试,大多数现代浏览器也会缓存旧的 CSS。尝试清除缓存。如果这不能解决问题,那么我唯一可以建议的另一件事是查看此 SO stackoverflow.com/questions/8558472/… 中建议的空白行答案

标签: ruby-on-rails asset-pipeline sprockets


【解决方案1】:

Rails 不应该保证不会呈现重复的文件吗?我可以吗 仍然保留“冗余”依赖项并渲染文件 只有一次?

简单的回答:没有

资产是预编译的,因此在生产中是“静态的”。您可以通过多种方式包含资产。因此,rails 无法“知道”在渲染页面的上下文中应该删除哪些文件。

您需要确保没有重复。

【讨论】:

  • 从前端开发人员的角度来看,这正是 #=require 不是在任何 JS 应用程序中加载 JS 文件的令人满意的解决方案的确切原因,即使是轻微的复杂性。使用模块加载器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多