【问题标题】:Page specific javascript files in Rails 3.1Rails 3.1 中的页面特定 javascript 文件
【发布时间】:2012-01-19 05:43:25
【问题描述】:

我一直在研究这个:

Using Rails 3.1, where do you put your "page specific" javascript code?

但我还没有看到满意的答案,这也让我怀疑我是否做错了什么。

这是我的心智模型:对于不同的观点,我会有不同的看法

$(document).ready(....)

块,显然引用了特定于该页面的元素。我不想通过为每个页面加载该代码并以某种方式试图弄清楚如何仅在特定页面上执行它来污染事物;这看起来很丑。

我的直觉,诚然没有任何初步实验的支持,是理想的事情是:

  1. 从 application.js 加载应用程序范围的代码。
  2. 从 assets/controller_name/shared.js 之类的文件中加载共享控制器代码
  3. 从 assets/controller_name/show.js 之类的文件中加载特定于视图的代码

在我的脑海中。助手将在第一次运行时检查文件是否存在,如果存在,则为其执行 javascript_include。

与“让我们将整个东西包裹在一个大粘性球中并全部发送”的方法相比,这可能存在一些性能问题,但似乎是划分代码的更好方法。

但是,如上所述,我觉得我错过了一些东西。 $(document).ready 在每页的基础上是一个坏主意吗?是否应该只在模板中并从 application.js 调用页面特定的 JS 位?上面的链接文章得出了这个结论,但我不喜欢我脑海中出现的一个巨大的 $(document) 的图像。如果这个,如果那个,如果另一个,我已经准备好了。

【问题讨论】:

标签: javascript ruby-on-rails ruby-on-rails-3.1 unobtrusive-javascript


【解决方案1】:

您建议的是合理的,但不是 rails 3.1 方式。

他们说将 JS 分成许多文件,但作为一个整体提供给用户。这允许更好的性能和可扩展性,如果最后的大块泥不是那么大,这是一件好事。确实 3 个 http 请求的性能比 1 个 http 请求差。

所以你已经对你的代码进行了分区,因为你有不同的 Coffeescript 文件,它们有不同的范围。

要加载到您的应用中,只需标准化一种初始化单段代码的方法,例如调用“myapp.users.init()”方法-。

您甚至可以使用帮助程序自动实现代码的和平,因此它对控制器来说是透明的。

【讨论】:

  • 我觉得奇怪的是,在任何地方都没有提到标准的做事方式,而这必须是一个相当标准的问题。此外,您可以相当轻松地连接控制器/动作文件,只剩下两个下载,而不是三个,这还不错。
【解决方案2】:

背景

(为什么要使用资产管道?)

Rails 资产管道背后的一个基本前提是,最好预先为一个站点加载一次所有 JS 和 CSS,然后无限期地缓存它们(至少在站点更新之前)。资产管道允许您相对自动地执行此操作,同时仍以合乎逻辑的方式组织您的 JS 和 CSS src 文件。

这当然会带来前期加载成本,以节省额外的往返加载单个文件的时间。如果这个前提不合适,那么资产管道可能不适合您。

问题的关键

好的,所以我们想将我们所有的 JS 合并到一个文件中以更有效地加载它。仅仅因为我们要加载我们所有的 JS 并不意味着我们要运行我们所有的JS。

在一个复杂的 web 应用程序的现实中,您可能会有很多特定于页面的功能,当用户没有查看相应的页面时,您不希望花费资源来执行这些功能。我们需要的是一个统一的策略,只执行我们的大型单体 JS 文件中适用于当前页面的部分。

救援公约

我不知道官方的 Rails 策略来处理这个问题,但是有一些很好的解决方案可以建立并利用一个好的约定(这会让事情感觉“有条不紊”)。总体思路是将所有特定于页面的 JS 代码定义为对象字面量,然后在加载时仅运行与当前页面相关的代码。

有关如何组织和有条件地执行 JS 代码的具体策略,请参阅@welldan97 对此问题的回答:
Using Rails 3.1, where do you put your "page specific" javascript code?

这又是基于 Jason Garber 的这篇文章:
http://viget.com/inspire/extending-paul-irishs-comprehensive-dom-ready-execution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-12
    • 2017-05-05
    • 1970-01-01
    • 2013-04-27
    • 2011-12-28
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多