koa-views
代码量只有 50+ 行 - 当然用到了其它库
// 开启 debug 模式
process.env.DEBUG = 'koa-views'
// 主要关注数据对象合并关系
// locals => ctx.render('tpl', locals) 可选
// options => 初始化时,传递的 options 属性
// ctx.state => koa 实现,middleware 共享数据
state = Object.assign(locals = {}, options, ctx.state || {})
// 调用引擎,返回 promise
// 支持自定义模板引擎,engineSource 属性,
// 返回引擎即可
// engine(realfilepath, state)
consolidate
自身代码量相当小,大部分都是在兼容各家模板
// 用来存储各引擎
requires = {}
// 用来存储各编译后的函数
// 关系:{ filename: tmpl }
cacheStore = {}
// 用来存储文件内容 { path: string }
// 当存储到 cacheStore 后,这里就直接清除
readCache = {}
// 清理 cacheStore 和 readCache
clearCache()
// 读/写接口,依赖 options:
// cache/filename
cache(options, compiled)
// 读文件内容,
// 把内容的 BOM 头去掉。
// string = string.replace(/^\uFEFF/, '');
// 如果支持 cache
// 就缓存到 readCache[path] = string
read(path, options, fn)
// 把各个 partial: {key: _path_}
// 更新为 {key: string}
// 特殊处理部分:
// _path_ 不存在 (null, undefined, false),直接跳过
// _path_ 是绝对地址,如果不存在 extname, 就补充为 path 的 extname
// _path_ 是相对地址,
// file = join(dirname(path), _path_, extname(path))
readPartials(path, options, fn)
// 把 callback 形式转成 promise 形式
promisify(fn, exec)
// 通用模板处理形式
// 支持 partials
// return (path, options, fn) => {}
fromStringRenderer(name)