-1

我目前同时使用rails 2rails 3

文档说所有页面的所有样式都被编译到一个文件中。

例如,一个新的 Rails 应用程序包含一个默认的 app/assets/javascripts/application.js 文件,其中包含以下行:

// ...
//= require jquery
//= require jquery_ujs
//= require_tree .

我对 rails 处理这个问题的方式感兴趣。如何将所有样式写入一个文件。它是为每一页做的,还是在单独的文件中制作样式?rails 2和rails 3之间的方法有什么区别?

4

1 回答 1

1

Rails 3(准确地说是.1)给了我们资产管道。如您所见,资产管道使用 application.js 和 application.css。

资产管道所做的是将所有不同的 javascript 文件取出并打包成一个大文件(通常是 application.js)。

这里的想法是,您可以像您所说的那样为每个控制器编写一个 javascript 文件,然后资产管道将所有内容放在一起并将其作为一个大文件提供。这对性能有好处,对开发人员也有好处。(包含的小文件更容易推理和维护)。

资产管道还添加了一些约定:javascript 存在于app/assets/javascripts(以及我认为的其他一些定义的位置),每个控制器通常一个文件(但您可以有多个文件!),并且这个 javascript 实际上可以由某种语言机器生成输出 Javascript。(Coffeescript是这种语言的一个例子——Coffeescript 不是 Javascript,但 Coffeescript 编译器输出 Javascript)。

资产管道为 Rails 应用程序带来了结构。通常,如果我在一个项目中,我会将 javascript 放在三个地方之一:app/assets/javascript对于我自己的应用程序代码,lib/assets/javascript对于我可能在不同项目中共享的一些常用实用程序,以及vendor/assets/javascript来自开源社区的 jQuery 或 Javascript 库之类的东西那不是我的。

以前,在 Rails 2 中,你所有的 Javascript 都存在于public/javascripts/. 我的意思是一切:可能包含您自己的逻辑的 javascript 文件,可能很大的文件(开发人员很难推理),因为每次您需要一个新的 jQuery 回调时,您都将其添加到public/javascripts/application.js. 您可以将实用程序模块与供应商代码与您希望有一天提取的 Javascript 混合在一起。用 DHH 的话来说,这是一个垃圾抽屉。

资产管道为我们提供了位置、每个控制器一个文件和打包/优化 Javascript 的约定,以便在客户端下载更快。

总之:Rails 脚手架命令生成app/assets/javascripts/your_controller.js.coffee。在此文件中,您应该添加与该控制器提供的视图相关的 Javascript。这是一个最佳实践和一个好主意。

值得注意的是,您的所有 Javascript 代码最终都会被计算机编译成一个大文件,并且有时这种抽象会泄漏。(例如,两个不同的 javascript 文件完全意外地将两个不同的事件绑定到同一个 Javascript id)。这些泄漏的抽象是为什么资产管道有很多尖锐的边缘,以及关于 SO 的很多资产管道问题。

于 2013-04-24T13:41:02.323 回答