我是rails的新手,我对资产的加载方式感到有些困惑。我可以让事情有效,但我想了解幕后真正发生的事情。
我一直在阅读文档,但有些事情我完全不理解。
预告文件
首先让我困惑的是清单文件的使用。
例如,如果在我的app / assets / javascripts / application.js文件中,我有:
//= require_tree .
Rails文档说:
告诉Sprockets以递归方式包含所有JavaScript文件 指定目录进入输出
我不清楚哪个目录?应用程序/资产/ Javascript角/?
这是否意味着如果我在app / assets / javascripts /中添加文件,它将被加载并提供?
如果我添加一个需要添加文件example.js的gem我需要添加到清单文件中:
//= require example.js
但是,如果//= require_tree
已经加载并提供app / assets / javascripts /中的文件,那么为什么这是必要的呢?这是我放置example.js的位置?好的,这允许我指定订单,如果以后我添加更多要求。但除此之外呢?
HTML文件
然后将脚本包含在application.html.erb
中<%= javascript_include_tag ('application'), 'data-turbolinks-track' => true %>
据我所知,这会加载上面提到的application.js文件,因此会加载其中的各种//= require
。
有时需要将特定文件编写为:
<script src="js/example.js"></script>
这种情况不是<script src="js/example.js"></script>
做//= require example.js
完全相同的事情吗?
PUBLIC VS APP资产
据我所知,如果我将example.js文件放在public / assets文件夹中,它将不会被编译,而是单独提供。我为什么要这么做?如果在连接和编译时文件未正确提供并且仅在服务分开时才起作用,这样做是否合理?换句话说,如果我在app / assest上包含一个.js文件并且它有加载或破坏的问题,是否值得尝试从那里删除它并将其移动到公共/资产或这是否有意义?
APP资产与供应商资产
我应该在哪种情况下将文件添加到供应商资产而不是应用资产?将它添加到某个地方有什么区别? 在我的vendor / assets / javascripts中,我只有一个空的.keep文件。所以就像应用程序/资产上的清单文件一样。然后如何引用此文件夹中的文件?
答案 0 :(得分:1)
对于采用路径参数的指令,您可以指定a 逻辑路径或相对路径。相对路径以./和开头 相对于当前文件位置的引用文件。
因此//= require_tree .
告诉sprockets加载app/assets/javascripts/
中的任何文件并将它们连接到application.js。
此方案不是
<script src="js/example.js"></script>
做同样的事情// = require example.js?
没有。 Rails将资源作为开发中的单独文件提供,以便在发生错误时获得有意义的行号和文件引用。
在生产中,它会连接并缩小对性能很重要的资产。
Sprockets不会检查脚本标记的视图/布局。所以前者会产生两个请求。
我理解如果我将example.js文件放在public / assets上 文件夹它不会被编译但是单独提供。我为什么要这样做 是什么?
公共目录位于服务器Web根目录下。由于文件服务没有太多干预,因此它是错误页面或需要具有静态名称而没有缓存破坏指纹的资产的好地方。
我应该在哪种情况下将文件添加到供应商资产而不是应用 资产?将它添加到某个地方或之间有什么区别 另一?
/vendor/assets
是放置不是由您创建或不属于应用程序的资产的地方。两者都被添加到链轮加载路径,因此结果是相同的。它只是一个代码组织问题。