Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将我所有的javascript都放在application.js中并使用require_tree可以吗?_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 将我所有的javascript都放在application.js中并使用require_tree可以吗?

Ruby on rails 将我所有的javascript都放在application.js中并使用require_tree可以吗?,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我对Rails还比较陌生,这更像是一个“最佳实践”问题。请让我知道,如果我应该在另一个SE网站上问这个问题 到目前为止,我一直认为资产管道是理所当然的。但是,随着资产(CSS和JS)变得越来越复杂,我开始意识到,在每个页面上加载所有资产可能不是很有效。我现在拥有的是这样的东西: application.js: ... //= require_tree . $(document).ready(function() { //page A scripts/handlers ...

我对Rails还比较陌生,这更像是一个“最佳实践”问题。请让我知道,如果我应该在另一个SE网站上问这个问题

到目前为止,我一直认为资产管道是理所当然的。但是,随着资产(CSS和JS)变得越来越复杂,我开始意识到,在每个页面上加载所有资产可能不是很有效。我现在拥有的是这样的东西:

application.js:

...
//= require_tree .

$(document).ready(function() {

    //page A scripts/handlers
    ...

    //page B scripts/handlers
    ...

    //page C scripts/handlers
    ...
});
我的理解是,由于
require\u tree
,整个代码将加载到A、B和C页。对吗

我是否应该开始考虑删除
require_tree
并将这些资产分离到它们自己的控制器特定资产文件中,其中application.js和application.css仅包含“共享”脚本/处理程序/样式,然后加载它们:

<%= javascript_include_tag params[:controller] %>



还是我想得太多了?我主要关心的是,随着我的应用程序变得越来越复杂,我需要有效地管理复杂性。因此,我宁愿现在就开始用正确的方式做事,而不是以后再处理头痛问题。

这确实是一个偏好的问题。没有对错之分(取决于你问谁),所以你真的希望你的应用程序如何工作

您完全正确,在application.js中使用
require_tree
将把您所有的js文件合并到一个资产中,并将加载到每个页面上,但是当rails进入生产模式,并且您的资产被预编译时,会发生两件事

  • 代码将被缩小
  • 您的资产将被“指纹”用于缓存目的
接下来会发生的是,您的“大”javascript文件将变得更小。另一件事是rails将把这个压缩文件移动到
public
文件夹中,使其成为静态资产。一旦发生这种情况,运行rails的web服务器可以让您的浏览器知道它可以缓存它,因此即使应用程序中的每个页面都会引用它,您的浏览器也只会下载一次(直到指纹更改或清除缓存)

我最近开发的一个应用程序有一个非常大的javascript结构,其中未压缩的
application.js
文件以2MB+的速度下载。在开发模式下,每次重新加载页面时都会下载,所以可以想象,这非常缓慢

一旦我们将rails投入生产模式并编译了我们的资产,js文件就变成了500KB左右,并且被下载了一次。好多了

这同样适用于CSS文件和图像,尽管很明显,图像不会成为一个包含所有内容的大图像文件

如果您与一些铁杆JS人员交谈,使用资产管道并不是最好的选择,因为处理JS中的依赖项可能会变得有点难看,此时您应该考虑使用库,如RequireJS或Browserify。但考虑到您对rails还很陌生,我现在不想这样做

所以,在这一切结束时,这真的是你的选择。如果您希望每个页面都有一个javascript文件,那么就去吧!资产管道将如您所期望的那样工作,它仍然会将它们编译成静态文件,浏览器仍然会缓存它们。然而,您必须做的一件事是告诉rails您想要编译不止一个JS文件

默认情况下,在生产环境中,rails只预编译
application.js
文件。如果您选择有多个文件,那么这不是您想要的。您需要对此进行更改,以告诉rails您希望它编译assets文件夹中的所有JS文件。您可以在
production.rb
文件中执行此操作。一个快速的google或stack overflow搜索将向您展示如何做到这一点,但它实际上是直截了当的


如果您选择坚持使用require_tree选项,那么您不需要做任何事情,rails在生产环境中已经为您设置好了:)

通常我喜欢在布局上使用内容。(例如:application.html.erb)


并包括自定义视图上的文件:(ex:index.html.erb)


“全部”、“数据涡轮链接跟踪”=>true%>

我不喜欢把所有的脚本和样式都放在application.js上,因为在一些大型应用程序(没有单页应用程序)中,它会删除很多请求中未使用的样式和脚本。对于具有角色和管理员或默认用户区域的某些应用程序,可能有些用户不需要加载所有脚本和样式。

好的,我知道这与下载和缓存的文件有关(网络利用率)。但是网页性能呢?当我在我的页面上使用Chrome的审计工具时,首先出现的警告之一是“删除未使用的CSS-90%的应用程序。此页面上未使用CSS”。我的理解是,未使用的规则会降低页面呈现速度。理论上确实如此,但这实际上取决于样式表的大小。如果你在看成千上万条规则,那么当然,把它们分开,但如果不是,那么你可能正在看一个不明显的减速。这是很好的解释
<%= stylesheet_link_tag params[:controller] %>
<% if content_for?(:custom_css) %>
<%= yield(:custom_css) %>
<% end %>

<% if content_for?(:custom_js) %>
<%= yield(:custom_js) %>
<% end %>
<% content_for :custom_css do %>
<%= stylesheet_link_tag "common/timepicker/jquery.timepicker", :media => 'all', "data-turbolinks-track" => true %>
<% end %>