Mustache.js 模板引擎核心语法与实战详解
本文详细解析 Mustache.js 轻量级 JavaScript 模板引擎的核心用法。内容涵盖基础变量输出、HTML 转义控制、子属性绑定、条件渲染逻辑、数组循环遍历、函数节处理以及部分模板嵌套等关键特性,通过具体代码示例帮助开发者快速掌握前端模板渲染技巧。
Mustache.js 基础语法与函数处理
本文将深入解析 Mustache.js 这一轻量级 JavaScript 模板引擎的具体使用方法。
基础示例
function show(t) {
$("#content").html(t);
}
var view = {
title: 'YZF',
cacl: function () {
return 6 + 4;
}
};
$("#content").html(Mustache.render("{{title}} spends {{cacl}}", view));
从示例中可以清晰看到 Mustache 模板的基本语法:只需使用双大括号 {{ 和 }} 包裹住数据对象的属性名称即可。
此外,示例还展示了当模板中指定的属性值为函数时的处理机制:Mustache 不会直接输出函数代码,而是先执行该函数,并将函数返回的结果渲染到页面上。
HTML 转义与子属性绑定
HTML 标签不转义处理
var view = {
name: "YZF",
company: "<b>ninesoft</b>"
};
show(Mustache.render("{{name}} <br /> {{company}} <br />{{{company}}}<br/>{{&company}}", view));
通过上述示例可知,Mustache 默认会对值中包含的 HTML 标记进行转义处理。然而在某些场景下,开发者可能希望直接渲染 HTML 代码而非显示其源码。
为解决此问题,可以使用三对大括号 {{{ 和 }}} 进行包裹,或者在双大括号 {{ 和 }} 前添加 & 符号(即 {{&key}}),这样 Mustache 就不会对内部的 HTML 标记进行转义。
子属性绑定
var view = {
"name": {
first: "Y",
second: "zf"
},
"age": 21
};
show(Mustache.render("{{name.first}}{{name.second}} age is {{age}}", view));
许多开发者会关注如何绑定嵌套对象的子属性。只需在属性名中使用点号 . 即可轻松访问子属性,例如 {{name.first}}。
条件渲染与数组循环
条件渲染控制
var view = {
person: false
};
show(Mustache.render("eff{{#person}}abc{{/person}}", view));
除了基础输出,根据数据值决定某部分内容是否渲染是常见需求。需要注意的是,导致部分不渲染的值不仅限于 false。
null、空数组、数字 0 以及空字符串同样会导致指定部分不被渲染。其语法结构相对简单,通过 {{#key}} ... {{/key}} 来包裹需要条件控制的代码块。
数组循环输出
var view = {
stooges: [
{ "name": "Moe" },
{ "name": "Larry" },
{ "name": "Curly" }
]
};
show(Mustache.render("{{#stooges}}{{name}}<br />{{/stooges}}", view));
掌握前述基础用法已能解决大部分常规需求,但处理列表数据时,手动逐个编写代码显然效率低下。Mustache 提供了便捷的循环输出机制:当数据源为由对象组成的数组时,若需输出数组元素本身(而非特定属性),应使用 {{.}} 代替具体的属性名如 {{name}}。
函数节处理与反义节应用
循环中调用函数处理
var view = {
"beatles": [
{ "firstname": "Johh", "lastname": "Lennon" },
{ "firstname": "Paul", "lastname": "McCartney" }
],
"name": function () {
return this.firstname + this.lastname;
}
};
show(Mustache.render("{{#beatles}}{{name}}<br />{{/beatles}}", view));
若希望在循环输出过程中对数据进行后期加工,Mustache 同样支持。当在数组上下文中使用函数作为节时,外层数组会被作为参数传递给该函数,开发者可在函数内部处理并返回期望的值。
自定义函数节
var view = {
"name": "Tater",
"bold": function () {
return function (text, render) {
return render(text) + "<br />";
}
}
}
show(Mustache.render("{{#bold}}{{name}}{{/bold}}", view));
此前示例主要使用变量作为节的标识,若改用函数作为节,其工作机制会有所不同。
系统会调用该函数返回的另一个函数,并将节内的原始字符串作为第一个参数,默认的解释器(render 函数)作为第二个参数传入。这种机制允许开发者对内容进行自定义加工处理。
反义节(取反节)
var view = {
"repos": []
};
show(Mustache.render("{{#repos}}{{.}}{{/repos}}{{^repos}}no repos{{/repos}}", view));
前述的条件节仅能控制内容的“显示”或“隐藏”,若需实现类似 if-else 的逻辑,则需要使用反义节。
当使用 {{^key}} 和 {{/key}} 定义节时,仅当该 key 对应的值为空、null、空数组或空字符串时,节内的内容才会被显示。这实现了条件取反的效果。
部分模板与预编译优化
部分模板(Partials)
var view = {
names: [
{ "name": "y" },
{ "name": "z" },
{ "name": "f" }
]
};
var base = "<h2>Names</h2>{{#names}}{{>user}}{{/names}}";
var name = "<b>{{name}}</b>";
show(Mustache.render(base, view, { user: name }));
虽然 Mustache 能节省大量开发时间,但若定义了大量模板且彼此无法复用,仍会导致代码冗余和维护繁琐。
为此,Mustache 提供了部分模板功能,允许在其他模板中复用已定义的模板片段。复用语法为 {{>templatename}}。
使用部分模板时,Mustache.render 方法需要传入第三个参数,用于指定部分模板的具体定义对象。
模板预编译
Mustache.parse(template);
//其他代码
Mustache.render(template,view);
模板渲染虽具优势,但编译过程会消耗一定时间。若在已知将频繁使用某个模板的前提下,可预先通过 Mustache.parse 进行编译,从而提升后续渲染效率。
希望本文的详细介绍能协助大家更好地学习和应用 Mustache.js。
JavaScript怎么准确判断数据类型:typeof、instanceof与Object.prototype.toString
2026-11-05 17:09:21
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
