如果只在特定页面上使用,为什么不应该将javascript置于视图中?

时间:2016-12-29 20:38:24

标签: javascript ruby-on-rails turbolinks

his answer Richard Peck 中写道:

不引人注目的JS

要考虑的其他事项(您已经完成此操作),您确实需要在应用程序中使用不显眼的JavaScript。

不引人注目的JS基本上意味着你能够抽象你的"绑定"从您的页面到资产管道中的Javascript文件。有几个重要原因:

  
      
  • 您的JS可以加载到您想要的任何页面上(它干了)

  •   
  • 您的JS将驻留在"后端"您的应用(赢得了污染视图)

  •   
  • 您将能够使用JS在屏幕上填充您想要的各种元素/对象
  •   

始终建议您将JS放入单独的文件中 - 包括在视图中为您设置一个大麻烦

这让我想到了以下问题:

  

如果我只在某个页面上使用脚本,为什么我要在每个页面上加载它?不反对DRY吗?也许我没有正确理解Rails管道的工作原理。

2 个答案:

答案 0 :(得分:2)

  

Rails管道

它不是Rails管道,unobtrusive JS是一种标准的编程模式。

从页面("内联")中提取JS到外部文件清理页面,仅此而已。

如果要快速加载页面,则需要将JS拆分为单独的文件。这可以是类的形式,但主要用于特定于页面的功能。例如,您可能有admin.jsapplication.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代码不会被多次评估。