为各种 ruby 模版提供统一接口,模版也包括 coffeescript, sass 这些预处理器。
tilt 提供一个 Template 的基类。扩展新的 tilt 模版只需要继承这个类,实现prepare
和evaluate
方法就可以直接通过文件path
创建 template 实例然后调用render
方法得到结果。
这些 template 在sprockets
里面又统一叫做engine
一个文件查找器,可以根据文件名遍历某个路径下的文件,查找到文件然后返回文件的绝对路径。
append_path
方法指定查找路径,append_extension
指定查找文件的扩展名。
environment
对象也有这两个方法,就是委托给它的@trail
实例变量去做的。
sprockets
有几个路径的术语需要注意。
load_path
: 用来搜索 assets 的目标路径。比如安装bootstrap-rails
就可以把它的路径加到load_path
, 这样就可以通过 gem 来提供静态文件。
logical_path
: 静态文件asset
总是通过logical_path
引用,可以理解成文件名。
是 asset 文件相对于静态文件根目录下的路径。
类似与application.js
或者models/project.js
这样的形式。
path
是指的文件绝对路径。代表在文件系统中的真实路径。
上面提到的hike
这个库在load_path
中查找,并通过logical_path
找到path
。
hike
内部有提供对这个查找实现的一个简单缓存。
Asset
代表静态文件,它有三个子类
1. StaticAsset
不需要处理,大多是图片,但是需要生成摘要
2. ProcessedAsset
: 需要经过处理器处理
3. BundledAsset
: 通过注释里面的 directive 来创建 asset bundles
与Asset
相关的还有一个AssetArributes
类,所有属性都通过这个类来进行管理,可以得到每个文件的扩展名,格式,需要使用的处理器。
Environment
和Index
类继承Base
类。
Base
类里面 include 了Caching
, Paths
, Mime
, Processing
, Compressing
, Engines
, Server
几个 module, 基本是一个 module 一个文件。
Index
是一个 cached 版本的Environment
, 自己本身不暴露,而是通过Environment
的index
方法被实例化去调用
Environment
可以获取 assets 以及某个 path 对应的文件的 attributes, servering assets, 操作路径,注册处理器,指定 context..
可以说是负责了所有的事情,无所不知...
Context
是处理器真正执行的地方,通过 asset 的 attributes 拿到所有处理器,然后迭代对文件内容进行处理并最终返回。
Engine
就是各种处理器了 engine 包括 template 和 processor 每一个 engine 和一个 filename extension 绑定
engine 通过 extensions 扩展名指定 extensions 可以层叠,然后根据扩展名会从右到左求值 (.css.scss.erb...) engine 都必须遵循 Tilt::Template 接口,然后注册
sprockets
对engine
提供一个通过Sprockets
全局变量或者 Environment 实例的注册
1. Environment.register_engine ".ext", FooProcessor
2. Sprockets.register_engine ".sass", SassTemplate
sprockets 提供一个静态文件处理的 pipeline 编译环境。同时它也是一个基于 rack 的 rack app.
作为 rack app, 可以直接把它挂载在某个 url 下直接访问.
静态文件 asset 就可以直接通过它的logical_path
访问到
这里逻辑的入口就是 server.rb 那个文件,作为一个 rack app,必然有一个call
方法。
在这里调用find_asset
(在 base.rb 中定义) 找到对应的 asset。
find_asset
中调用build_asset
对 asset 进行编译返回对应的 asset。
build_asset
根据对应文件是否有处理器来决定asset
的类型是 processed 还是 static,asset 实例化的时候,会委托context
对象进行编译,这个过程都在 context.rb 的evaluate
方法中。
require
directive 如何工作..cache
机制怎样起作用..(cache_store)bower
的