Application.js超过1 Mb的导轨

San*_*eep 0 javascript ruby ruby-on-rails asset-pipeline

我有一个Rails应用程序,application.js资产编译后需要超过1 MB。这使我的整个网站变慢。

我使用Apache,Rails 4,jQuery,相当繁重的JavaScript和AJAX。如果有人能指出正确的方向,我将不胜感激。

Con*_*Kee 5

在您的特定情况下这可能不可行,但可以肯定地帮助我避免了Application.js的膨胀。

就像您确定的那样,Application.js将所有指定的文件(默认情况下,所有文件)编译为一个.js文件,该文件(同样,默认情况下)作为每个页面布局的一部分加载。通常,这会导致在每个页面中加载完全不必要的自定义脚本,并减慢整个应用程序的速度。我个人认为此行为不受欢迎。我发现适用于我网站的内容仅包含Application.js中的“核心” javascript组件(jquery,bootstrap的js库以及与layout.html.erb本身有关的任何脚本),并在需要的页面中指定其余部分他们。例如:

application.js

请注意,它不包含require tree .。这很重要,因为这是指定包括整个资产/ javascripts文件夹的行。在这种情况下,“模板”是与布局.html.erb有关的已定义的.js文件

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require bootstrap-sprockets
//= require template
//= require turbolinks
Run Code Online (Sandbox Code Playgroud)

layout.html.erb

以下是我的布局的最后部分,紧接在结束body标签之前。这将在每个页面上加载application.js,然后加载视图中指定的所有js。

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<% if content_for?(:javascript) %>
    <%= yield :javascript%>
<% end %>
Run Code Online (Sandbox Code Playgroud)

观点)

在需要页面特定javascript的任何视图中,都可以使用Rails javascript帮助器指定文件。

<% content_for :javascript do %>
   <%= javascript_include_tag 'pages/profile', 'data-turbolinks-track' => true %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

initializers / assets.rb

最后,即使您的脚本不是Application.js的一部分,也请确保它们仍在进行预编译。

Rails.application.config.assets.precompile += %w( pages/profile.js )
Run Code Online (Sandbox Code Playgroud)

...或者更有效地假设您有许多带有自己脚本的页面...

Rails.application.config.assets.precompile += %w( pages/* )
Run Code Online (Sandbox Code Playgroud)

结论

我发现该技术确实有助于减小Application.js的大小,并且通常可以作为良好的实践。希望它对您有所帮助,对于与您的问题无关的内容,我们深表歉意。