这在您的特定情况下可能不可行,但确实帮助我防止 Application.js 臃肿。
我相信您知道,Application.js 将所有指定的文件(默认情况下,所有文件)编译成单个 .js 文件,该文件(同样,默认情况下)作为每个页面中布局的一部分加载.通常这会导致在每个页面中加载完全不必要的自定义脚本,并减慢整个应用程序的速度。我个人认为这种行为是不可取的。我发现适用于我的网站的只是在 Application.js 中包含我的“核心”javascript 组件(jquery、bootstrap 的 js 库以及与 layout.html.erb 本身相关的任何脚本),并在需要的页面中指定其余部分他们。例如:
application.js
请注意,它不包括require tree .。这很重要,因为那是指定包含整个 assets/javascripts 文件夹的行。在这种情况下,“模板”是定义的与 layout.html.erb 相关的 .js 文件
//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require bootstrap-sprockets
//= require template
//= require turbolinks
layout.html.erb
以下是我的布局的最后,紧挨在结束 body 标记之前。这会在每个页面上加载 application.js,然后加载视图中指定的任何 js。
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<% if content_for?(:javascript) %>
<%= yield :javascript%>
<% end %>
视图
在任何需要特定页面 javascript 的视图中,您可以使用 Rails javascript 帮助程序指定文件
<% content_for :javascript do %>
<%= javascript_include_tag 'pages/profile', 'data-turbolinks-track' => true %>
<% end %>
初始化程序/assets.rb
最后,确保您的脚本仍在预编译中,即使它们不是 Application.js 的一部分。
Rails.application.config.assets.precompile += %w( pages/profile.js )
...或者,更有效地假设您有许多页面都有自己的脚本...
Rails.application.config.assets.precompile += %w( pages/* )
结论
我发现这种技术确实有助于减小 Application.js 的大小,并且总体上是一种良好的实践。我希望你觉得它有用,如果它与你的问题无关,请道歉。