我是 Rails 新手,无法找出组织资产的最佳方式。这个问题的目的是收集我的想法,征求意见,并随着时间的推移改进文档——也许有一天它可以成为 Rails 指南。(Rails Wiki 似乎已经死了。)这将是对新手概念化的帮助,而不是参考,因此它将仅限于最常见的场景。
资产管道 - 概述
有关管道的目的、好处和内部工作原理的详细信息,请从本指南开始:http: //guides.rubyonrails.org/asset_pipeline.html 我将在这里仅总结与我的目的相关的部分。
需要管道的原因是:
- 编译:将高级语言(ERb、Haml、Sass、LESS、CoffeeScript...)编译成纯 CSS/JS。
管道的额外好处是:
- 串联:将多个文件合并为一个以提高客户端性能。
- 缩小:删除空格和其他巧妙的优化以减小文件大小。
- 指纹识别:在文件名中添加了文件内容的 MD5 哈希,以强制缓存在文件更改时再次获取文件。
资产管道 - 默认文件系统布局
app|lib|vender/assets/
- 用于将由管道处理的文件。app/assets/
- 专门用于您为应用程序创建的文件。lib/assets/
- 专门用于您为在多个应用程序之间共享而创建的文件。vendor/assets/
- 专门用于其他人创建的文件,例如 jQuery 和 Twitter Bootstrap(尽管它们经常由 gems 提供,而不是直接导入 /vender)。public/
- 此处的文件保持原样,可直接从 Web 应用程序的根路径 ('/') 获取。
资产管道 - 默认文件和行为
应用程序/资产/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
应用程序/资产/样式表/application.css
/*
*= require_self
*= require_tree .
*/
public/404.html
public/robots.txt
...
宝石文件
...
gem 'jquery-rails'
...
以下是资产管道编译器使用新 Rails 应用程序的默认设置所做的事情:
- 默认情况下,编译器将处理
application.js
、application.css
和所有非 JS/CSS 文件(主要是图像)。 - 这两个应用程序文件包含 sprockets 指令(以 = 开头的注释行)。Sprockets 是为 Rails 资产管道编译提供支持的库。这些指令也称为manifests,因为它们列出了要包含的文件。
application.js
包含拉入两个 jquery 文件(存在于 jquery-rails gem 中,而不是在您的应用程序中)的清单,然后app/assets/javascripts/
通过require_tree .
. 通过此清单包含的所有文件都将编译为一个名为 的文件application-[the MD5 hash].js
,并放置在public/assets/
.application.css
包含一个清单,该清单app/assets/stylesheets/
通过require_tree .
. 该required_self
指令告诉编译器在application.css
文件本身中包含任何 CSS 内容,并且按照指令的顺序。因此,在这种情况下,其中的 CSSapplication.css
将出现在其余部分之上。通过此清单包含的所有文件都将编译为一个名为 的文件application-[the MD5 hash].css
,并放置在public/assets/
.- app/assets 树中的所有非 JS/CSS 文件(主要是图像)也将被指纹识别并放置在 中
public/assets/
,目录结构保持不变。例如,app/assets/images/categories/computers.png
最终将作为public/assets/categories/computers-[the MD5 hash].png
.
概念化资产内依赖场景
图片
图像之间没有依赖关系,它们总是独立存在的。
样式表
- CSS: CSS 文件可以相互导入,只要路径正确就可以使用,尽管这可能不是最好的技术。
- Sass: Sass 文件可以相互导入,也可以共享变量和 mixin,但前提是它们仍然是 Sass(不是在编译成 CSS 之后),并且只能通过 Sass 导入。如果您有
application.css.scss
需要“a”和“b”的 sprockets 指令,它们将在合并之前在单独的上下文中编译。要共享变量和 mixin,您必须使用 Sass 导入指令从 'b' 导入 'a',反之亦然。(请参阅下面的关键概念 1。) - LESS: [对此了解不够。]
JavaScript
- JS: JavaScript 组件具有相互依赖关系(例如:Twitter Bootstrap 使用 jQuery)。但是,它们都在运行时在浏览器中得到解析,因此无论您如何组织/组合项目中的文件,只要所有内容最终都由浏览器加载即可。
- CoffeeScript: [对此了解不够。]
辅助行为 - Rails 视图
去做
辅助行为 - Sass
去做
最佳实践 - 关键概念
- 该管道用于为生产准备资产。将其视为部署系统的一部分,而不是应用程序本身。自己建立应用程序的逻辑结构,然后配置 sprocket 以在该结构上正确运行。
最佳实践 - 通用资产场景
去做
最佳实践 - 一般有用的默认值摘要
去做
** 问题 **