ejs 执行流程
ejs.render 和 ejs.renderFile 最后都是调用 ejs.compile 方法(动态生成funtion)。
核心就是 ejs.compile
这个函数核心就是一直遍历indexOf找到关键的<% <%=等字符串,不同标记对应不同的模式,解析出一个数组里面按顺序push进来这些标记代码块,最后生成一个匿名函数,即是compile函数执行
(function anonymous(locals, escapeFn, include, rethrow
) {
var __line = 1
, __lines = "<div><%=name%></div>"
, __filename = undefined;
try {
var __output = "";
function __append(s) { if (s !== undefined && s !== null) __output += s }
with (locals || {}) {
; __append("<div>")
; __append(escapeFn(name))
; __append(escapeFn(name))
; __append("</div>")
}
return __output;
} catch (e) {
rethrow(e, __lines, __filename, __line, escapeFn);
}
})
- template = returnedFn(data)
- locals 为 data
- escapeFn 是处理特殊字符的函数,默认处理的是 &<>'" 五个字符,
{
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
-
- 该函数,通过 opts.escape || opts.escapeFunction 指定
- include 模板文件中有 include 引入了其他 ejs 模板时调用。此时,with 中会多出一行 ; __append( include(path, data) )
- rethrow 错误信息处理函数