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

2024-01-15

In writes:

不引人注目的 JS

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

不显眼的 JS 基本上意味着您能够将页面的“绑定”抽象到资产管道中的 Javascript 文件。造成这种情况有几个重要原因:

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

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

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

It's always建议你将 JS 放入单独的文件中 - 包括在视图中会让你陷入大混乱

这让我想到以下问题:

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


轨道管道

这不是 Rails 管道,不引人注目的 JS https://en.wikipedia.org/wiki/Unobtrusive_JavaScript是一个标准的编程模式。

将 JS 从页面(“内联”)提取到外部文件会清理页面,仅此而已。

如果你想让页面快速加载,你需要将 JS 拆分成单独的文件。这可以采用类的形式,但主要用于特定于页面的功能。例如,您可能有admin.js and application.js.


Rails

具体就 Rails 而言,处理不显眼的 JS 的方法取决于您如何precompile你的资产。标准方法是放置all将功能转化为application.js- 这显然会变得臃肿。

解决这个问题的方法是利用config.assets.precompile http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assetshook - 允许您指定要包含为单独预编译元素的文件:

# config/application.rb
config.assets.precompile << %w(admin.js cart.js etc.js)

这将改变为处理者manifest.js http://eileencodes.com/posts/the-sprockets-4-manifest/ in Sprockets 4+(如果需要,我可以在更新中对此进行解释)。我制造了一个commit https://github.com/rails/sprockets/pull/427到他们的仓库了解它。

这意味着当您预编译资产时(或者当您在开发中运行它们时——它们被缓存),您会得到admin.js或您定义为单独预编译的任何内容。这本身并没有什么意义。这些文件只会出现在public/assets.

What it does意思是你可以引用你的文件layout:

# app/views/layouts/application.html.erb
<%= javascript_include_tag :application, (:admin if [[condition]]) %>

or

# app/views/layouts/admin.html.erb
<%= javascript_include_tag :admin %>

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果javascript只在特定页面上使用,为什么不应该将其放在视图中? 的相关文章