开源项目 Sprockets 源码初体验

krazy · 2014年01月16日 · 最后由 krazy 回复于 2014年02月27日 · 5723 次阅读
本帖已被管理员设置为精华贴

需要了解的依赖

  • tilt

为各种 ruby 模版提供统一接口, 模版也包括 coffeescript, sass 这些预处理器。 tilt 提供一个 Template 的基类。扩展新的 tilt 模版只需要继承这个类,实现prepareevaluate方法就可以直接通过文件path创建 template 实例然后调用render方法得到结果。

这些 template 在sprockets里面又统一叫做engine

  • hike

一个文件查找器, 可以根据文件名遍历某个路径下的文件,查找到文件然后返回文件的绝对路径。 append_path方法指定查找路径, append_extension指定查找文件的扩展名。 environment对象也有这两个方法,就是委托给它的@trail实例变量去做的。

路径 (path) 和文件属性 (attributes)

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找到pathhike内部有提供对这个查找实现的一个简单缓存。

关键的类

Asset代表静态文件,它有三个子类

1. StaticAsset不需要处理,大多是图片,但是需要生成摘要 2. ProcessedAsset: 需要经过处理器处理 3. BundledAsset: 通过注释里面的 directive 来创建 asset bundles

Asset相关的还有一个AssetArributes类,所有属性都通过这个类来进行管理,可以得到每个文件的扩展名,格式,需要使用的处理器。

EnvironmentIndex类继承Base类。

Base类里面 include 了Caching, Paths, Mime, Processing, Compressing, Engines, Server几个 module, 基本是一个 module 一个文件。

Index是一个 cached 版本的Environment, 自己本身不暴露,而是通过Environmentindex方法被实例化去调用

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 接口,然后注册

sprocketsengine提供一个通过Sprockets全局变量或者 Environment 实例的注册 1. Environment.register_engine ".ext", FooProcessor 2. Sprockets.register_engine ".sass", SassTemplate

作为 rack app(入口)

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方法中。

更多...(再写就更臭更长了的内容)

  1. require directive 如何工作..
  2. cache机制怎样起作用..(cache_store)
  3. 如何支持bower

好详细呀

没看完,哈哈,跟看书差不多了 但 dig deeper spirit 必须顶

支持~ 要是带着疑问学习更好,呵呵。

@fantaxy025025 谢谢~ 现在看觉得可读性太差了,写的有点儿像 trackback 翻译...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号