脚手架难点(3)-ejs源码解析

220 阅读1分钟

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 是处理特殊字符的函数,默认处理的是 &<>'" 五个字符,
{
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&#34;',
  "'": '&#39;'
};
    • 该函数,通过 opts.escape || opts.escapeFunction 指定
  • include 模板文件中有 include 引入了其他 ejs 模板时调用。此时,with 中会多出一行 ; __append( include(path, data) )
  • rethrow 错误信息处理函数