如果仅在特定页面上使用javascript,为什么不应该将其置于视图中?
作者:互联网
不引人注目的JS
要考虑的其他事情(你已经这样做了),你真的需要在你的应用程序中使用不显眼的javascript.
不引人注目的JS基本上意味着您能够将页面中的“绑定”抽象为资产管道中的Javascript文件.有几个重要原因:
Your JS can be loaded on any page you want (it’s DRY)
Your JS will reside in the “backend” of your app (won’t pollute views)
- You’ll be able to use the JS to populate the various elements / objects you want on screen
总是建议你将你的JS放在单独的文件中 – 包括在视图中为你设置一个大麻烦
这让我想到以下问题:
If I am only using a script on a certain page, why would I want to have it load on every page? Doesn’t that go against the DRY? Maybe I am not properly understanding how the Rails pipeline works.
解决方法:
Rails pipeline
它不是Rails管道,unobtrusive JS是标准的编程模式.
将JS从页面(“内联”)提取到外部文件会清除页面,仅此而已.
如果要快速加载页面,则需要将JS拆分为单独的文件.这可以是类的形式,但主要用于特定于页面的功能.例如,您可能有admin.js和application.js.
轨道
特别是关于Rails,处理不引人注目的JS的方法归结为如何预编译资产.标准方法是将所有功能放入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.
这意味着当您预编译资产时(或者当您在dev中运行它们时 – 它们被缓存),您将获得admin.js或您定义的任何单独预编译的内容.这本身就没有任何意义;这些文件只会出现在公共/资产中.
它的意思是您可以引用布局中的文件:
# app/views/layouts/application.html.erb
<%= javascript_include_tag :application, (:admin if [[condition]]) %>
or
# app/views/layouts/admin.html.erb
<%= javascript_include_tag :admin %>
因此,您可以在需要时调用所需的文件.
我可以深入探讨,但这应该回答当前的问题.
标签:javascript,ruby-on-rails,turbolinks 来源: https://codeday.me/bug/20190627/1308750.html