在his answer Richard Peck 中写道:
不引人注目的JS
要考虑的其他事项(您已经完成此操作),您确实需要在应用程序中使用不显眼的JavaScript。
不引人注目的JS基本上意味着你能够抽象你的"绑定"从您的页面到资产管道中的Javascript文件。有几个重要原因:
您的JS可以加载到您想要的任何页面上(它干了)
您的JS将驻留在"后端"您的应用(赢得了污染视图)
- 您将能够使用JS在屏幕上填充您想要的各种元素/对象
始终建议您将JS放入单独的文件中 - 包括在视图中为您设置一个大麻烦
这让我想到了以下问题:
如果我只在某个页面上使用脚本,为什么我要在每个页面上加载它?不反对DRY吗?也许我没有正确理解Rails管道的工作原理。
答案 0 :(得分:2)
Rails管道
它不是Rails管道,unobtrusive JS是一种标准的编程模式。
从页面("内联")中提取JS到外部文件清理页面,仅此而已。
如果要快速加载页面,则需要将JS拆分为单独的文件。这可以是类的形式,但主要用于特定于页面的功能。例如,您可能有admin.js
和application.js
。
<强>滑轨强>
特别是关于Rails,处理不引人注目的JS的方法归结为你precompile
资产的方式。标准方法是将所有功能放入application.js
- 这显然会变得臃肿。
解决这个问题的方法是使用config.assets.precompile
钩子 - 允许您指定要包含的文件作为单独的预编译元素:
# config/application.rb
config.assets.precompile << %w(admin.js cart.js etc.js)
这将在Sprockets 4+
中更改为handled by manifest.js
(如果需要,我可以在更新中解释这一点)。我对他们的回购做了commit。
这意味着当您预编译资产时(或者当您在开发中运行它们 - 它们被缓存)时,您会得到admin.js
或您定义的任何单独预编译的内容。这本身就没有任何意义;这些文件只会出现在public/assets
。
它的含义意味着您可以引用布局中的文件:
# app/views/layouts/application.html.erb
<%= javascript_include_tag :application, (:admin if [[condition]]) %>
or
# app/views/layouts/admin.html.erb
<%= javascript_include_tag :admin %>
因此,您可以在需要时调用所需的文件。
我可以更深入地讨论这个问题。
答案 1 :(得分:1)
如果脚本是Turbolinks应用,则不会在每个页面上加载脚本。在Turbolinks中,您的javascript会加载一次,并且会在您的应用的整个生命周期中存在。因此,您可以将该页面特定的脚本放在主application.js文件中,并且当页面首次加载时,您的整个js代码(application.js中的所有内容)基本上只加载一次。如果您正在使用Rails但不使用Turbolinks或其他ajax技术(如客户端javascript框架),那么将针对每个请求评估特定于页面的javascript,从而像您所说的那样违反DRY并损害性能。
如果我只在某个页面上使用脚本,我为什么要这样做 每页都加载了ityo?
总结一下Turbolinks非常类似于Angular \ Backbone \在这方面的任何大多数其他javascript框架:你基本上在你的html布局中加载你的应用程序的整个javascript代码,无论用户导航到什么html您的应用中的JavaScript代码不会被多次评估。