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



Richard Peck在他的回答中写道:

不显眼的 JS

其他需要考虑的事情(你已经这样做了),是你真的需要在应用程序中使用不显眼的javascript。

不显眼的JS基本上意味着您可以将"绑定"从页面抽象到资产管道中的Javascript文件。这有几个重要原因:

  • 你的JS可以加载到你想要的任何页面上(它是DRY)

  • 您的JS将驻留在应用程序的"后端"中(不会污染视图)

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

始终建议您将JS放入单独的文件中 - 包括在视图中设置了大混乱

这让我想到了以下问题:

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

Rails pipeline

它不是Rails流水线,不显眼的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)

这将更改为由manifest.jsSprockets 4+中处理(如果需要,我可以在更新中解释这一点)。我向他们的回购做出了承诺。

这意味着,当您预编译资产时(或者在 dev 中运行它们时 - 它们被缓存),您将获得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 %>

因此,您将能够在需要时调用所需的文件。

我可以更深入地讨论,但这应该回答眼前的问题。

如果是 Turbolinks 应用程序,则脚本不会加载到每个页面上。在 Turbolinks 中,您的 JavaScript 加载一次,并在应用程序的整个生命周期内存在。因此,您将该页面特定的脚本放在主应用程序.js文件中,并且整个js代码(应用程序.js中的所有内容)基本上只加载一次,当页面首次加载时。如果你使用的是Rails,但没有使用Turbolinks或其他ajax技术(如客户端javascript框架),那么页面特定的javascript将针对每个请求进行评估,因此就像你说的那样违反了DRY并损害了性能。

如果我只在某个页面上使用脚本,我为什么要 每个页面上都有 ityo 负载吗?

总而言之,在这方面,Turbolinks与Angular\Backbone\任何其他JavaScript框架非常相似:你基本上在你的HTML布局中加载了应用程序的整个JavaScript代码一次,无论用户导航到应用程序中的javascript代码是什么html都不会被多次评估。

相关内容

最新更新