<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>krazy</title>
    <link>https://ruby-china.org/krazy</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Sprockets 源码初体验</title>
      <description>&lt;h3 id="需要了解的依赖"&gt;需要了解的依赖&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;tilt &lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这些 template 在&lt;code&gt;sprockets&lt;/code&gt;里面又统一叫做&lt;code&gt;engine&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hike&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一个文件查找器，可以根据文件名遍历某个路径下的文件，查找到文件然后返回文件的绝对路径。
&lt;code&gt;append_path&lt;/code&gt;方法指定查找路径，&lt;code&gt;append_extension&lt;/code&gt;指定查找文件的扩展名。
&lt;code&gt;environment&lt;/code&gt;对象也有这两个方法，就是委托给它的&lt;code&gt;@trail&lt;/code&gt;实例变量去做的。&lt;/p&gt;
&lt;h3 id="路径(path)和文件属性(attributes)"&gt;路径 (path) 和文件属性 (attributes)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sprockets&lt;/code&gt;有几个路径的术语需要注意。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;load_path&lt;/code&gt;: 用来搜索 assets 的目标路径。比如安装&lt;code&gt;bootstrap-rails&lt;/code&gt;就可以把它的路径加到&lt;code&gt;load_path&lt;/code&gt;, 这样就可以通过 gem 来提供静态文件。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;logical_path&lt;/code&gt;: 静态文件&lt;code&gt;asset&lt;/code&gt;总是通过&lt;code&gt;logical_path&lt;/code&gt;引用，可以理解成文件名。
是 asset 文件相对于静态文件根目录下的路径。
类似与&lt;code&gt;application.js&lt;/code&gt;或者&lt;code&gt;models/project.js&lt;/code&gt;这样的形式。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;path&lt;/code&gt;是指的文件绝对路径。代表在文件系统中的真实路径。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上面提到的&lt;code&gt;hike&lt;/code&gt;这个库在&lt;code&gt;load_path&lt;/code&gt;中查找，并通过&lt;code&gt;logical_path&lt;/code&gt;找到&lt;code&gt;path&lt;/code&gt;。
&lt;code&gt;hike&lt;/code&gt;内部有提供对这个查找实现的一个简单缓存。&lt;/p&gt;
&lt;h3 id="关键的类"&gt;关键的类&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Asset&lt;/code&gt;代表静态文件，它有三个子类&lt;/p&gt;

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

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

&lt;p&gt;&lt;code&gt;Environment&lt;/code&gt;和&lt;code&gt;Index&lt;/code&gt;类继承&lt;code&gt;Base&lt;/code&gt;类。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Base&lt;/code&gt;类里面 include 了&lt;code&gt;Caching&lt;/code&gt;, &lt;code&gt;Paths&lt;/code&gt;, &lt;code&gt;Mime&lt;/code&gt;, &lt;code&gt;Processing&lt;/code&gt;, &lt;code&gt;Compressing&lt;/code&gt;,   &lt;code&gt;Engines&lt;/code&gt;, &lt;code&gt;Server&lt;/code&gt;几个 module, 基本是一个 module 一个文件。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Index&lt;/code&gt;是一个 cached 版本的&lt;code&gt;Environment&lt;/code&gt;, 自己本身不暴露，而是通过&lt;code&gt;Environment&lt;/code&gt;的&lt;code&gt;index&lt;/code&gt;方法被实例化去调用&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Environment&lt;/code&gt;可以获取 assets 以及某个 path 对应的文件的 attributes, servering assets, 操作路径，注册处理器，指定 context..
    可以说是负责了所有的事情，无所不知...&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Context&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;是处理器真正执行的地方，通过 asset 的 attributes 拿到所有处理器，然后迭代对文件内容进行处理并最终返回。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Engine&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;就是各种处理器了
    engine 包括 template 和 processor
    每一个 engine 和一个 filename extension 绑定&lt;/p&gt;

&lt;p&gt;engine 通过 extensions 扩展名指定
    extensions 可以层叠，然后根据扩展名会从右到左求值 (.css.scss.erb...)
    engine 都必须遵循 Tilt::Template 接口，然后注册&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sprockets&lt;/code&gt;对&lt;code&gt;engine&lt;/code&gt;提供一个通过&lt;code&gt;Sprockets&lt;/code&gt;全局变量或者 Environment 实例的注册
    1. &lt;code&gt;Environment.register_engine ".ext", FooProcessor&lt;/code&gt;
    2. &lt;code&gt;Sprockets.register_engine ".sass", SassTemplate&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="作为rack app(入口)"&gt;作为 rack app(入口)&lt;/h3&gt;
&lt;p&gt;sprockets 提供一个静态文件处理的 pipeline 编译环境。同时它也是一个基于 rack 的 rack app.&lt;/p&gt;

&lt;p&gt;作为 rack app, 可以直接把它挂载在某个 url 下直接访问.
静态文件 asset 就可以直接通过它的&lt;code&gt;logical_path&lt;/code&gt;访问到&lt;/p&gt;

&lt;p&gt;这里逻辑的入口就是 server.rb 那个文件，作为一个 rack app，必然有一个&lt;code&gt;call&lt;/code&gt;方法。
在这里调用&lt;code&gt;find_asset&lt;/code&gt;(在 base.rb 中定义) 找到对应的 asset。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;find_asset&lt;/code&gt;中调用&lt;code&gt;build_asset&lt;/code&gt;对 asset 进行编译返回对应的 asset。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;build_asset&lt;/code&gt;根据对应文件是否有处理器来决定&lt;code&gt;asset&lt;/code&gt;的类型是 processed 还是 static，asset 实例化的时候，会委托&lt;code&gt;context&lt;/code&gt;对象进行编译，这个过程都在 context.rb 的&lt;code&gt;evaluate&lt;/code&gt;方法中。&lt;/p&gt;
&lt;h3 id="更多...(再写就更臭更长了的内容)"&gt;更多...(再写就更臭更长了的内容)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;require&lt;/code&gt; directive 如何工作..&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cache&lt;/code&gt;机制怎样起作用..(cache_store)&lt;/li&gt;
&lt;li&gt;如何支持&lt;code&gt;bower&lt;/code&gt;的&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>krazy</author>
      <pubDate>Thu, 16 Jan 2014 22:54:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/16841</link>
      <guid>https://ruby-china.org/topics/16841</guid>
    </item>
    <item>
      <title>王垠谈编辑器与 IDE</title>
      <description>&lt;p&gt;搬运..
&lt;a href="http://www.yinwang.org/blog-cn/2013/04/20/editor-ide/" rel="nofollow" target="_blank"&gt;http://www.yinwang.org/blog-cn/2013/04/20/editor-ide/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;还记得很久之前 &lt;a href="/luikore" class="user-mention" title="@luikore"&gt;&lt;i&gt;@&lt;/i&gt;luikore&lt;/a&gt; 写过一篇吐槽编辑器的文很好看...&lt;/p&gt;</description>
      <author>krazy</author>
      <pubDate>Sun, 21 Apr 2013 14:43:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/10381</link>
      <guid>https://ruby-china.org/topics/10381</guid>
    </item>
  </channel>
</rss>
