-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy path9行代码实现模板引擎.js
75 lines (61 loc) · 1.49 KB
/
9行代码实现模板引擎.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*! @preserve https://github.com/wusfen */
function wutpl(tpl){
var code = tpl
.replace(/<%=(.*?)%>/g, '\f_html_+= $1\f') // <%= %>
.replace(/<%(.*?)%>/g, '\f$1\f') // <% %>
.replace(/(^|\f)([\s\S]*?)(\f|$)/g, function($, $1, $2, $3){ // \f html \f
return '\n_html_+= "' + $2
.replace(/\\/g, '\\\\') // \ -> '\\'
.replace(/\r?\n/g, '\\n') // \n -> '\\n'
.replace(/"/g, '\\"') // " -> '\\"'
+ '"\n'
})
return Function('_data_', 'var _html_="";with(_data_){'+code+'}return _html_')
}
// ========== 示例与解析 ==========
// 模板
var tpl = `
<ul>
<% for(var i=0; i<list.length; i++){ %>
<li>
<%= list[i].name %>
</li>
<% } %>
</ul>
`
// 编译模板
var render = wutpl(tpl)
// 以上模板实际上编译成了以下代码 (render函数)
function anonymous(_data_) {
var _html_ = "";
with (_data_) {
_html_ += "\n<ul>\n "
for (var i = 0; i < list.length; i++) {
_html_ += "\n <li>\n "
_html_ += list[i].name
_html_ += "\n </li>\n "
}
_html_ += "\n</ul>\n"
}
return _html_
}
// 渲染数据
var html = render({
list:[
{id:1, name:'wsf'},
{id:2, name:'Tom'}
]
})
// 输出结果
console.log(html)
/*
<ul>
<li>
wsf
</li>
<li>
Tom
</li>
</ul>
*/
// 复以上内容到控制台运行即看到结果