Keep

读 koa-views 源码

12/21/2017, 6:30:00 AM 2 min read

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)
Tag:
JavaScript

@read2025, 生活在北京(北漂),程序员,宅,喜欢动漫。"年轻骑士骑马出城,不曾见过绝望堡下森森骸骨,就以为自己可以快意屠龙拯救公主。"