当前位置:首页 > 技术 > 正文内容

Mustache.js 模板引擎核心用法与外部模板加载实践

访客 技术 2026年6月6日 1

Mustache.js 作为 JavaScript 生态中经典的模板解决方案,采用"逻辑less"设计理念——模板层仅负责数据占位与结构呈现,所有业务判断均在数据准备阶段完成。

基础渲染机制

核心 API 为 Mustache.render(template, data),模板中通过 {{key}} 声明数据插槽:

<!-- 内联模板 -->
<script id="tmpl-greeting" type="text/template">
  <h3>{{greetText}}, {{user.alias}}!</h3>
</script>

<script>
  const source = document.getElementById('tmpl-greeting').innerHTML.trim();
  
  // 数据驱动渲染
  const output = Mustache.render(source, {
    greetText: '欢迎回来',
    user: { alias: 'Azure' }
  });
</script>

上下文遍历与条件渲染

{{#segment}} 兼具双重语义:当绑定值为非空数组时触发遍历,为真值时则表现为条件渲染;{{^segment}} 对应取反逻辑:

<script id="tmpl-profile" type="text/template">
  {{#hasAuth}}
    <ul>
      {{#skills}}
        <li>{{lang}} — 熟练度{{level}}</li>
      {{/skills}}
    </ul>
  {{/hasAuth}}
  {{^hasAuth}}
    <p>请先完成登录</p>
  {{/hasAuth}}
</script>

数据层控制逻辑:

const dataset = {
  hasAuth: true,           // 真值显示技能列表
  skills: [
    { lang: 'Rust', level: '精通' },
    { lang: 'TypeScript', level: '熟练' }
  ]
};

Lambda 与原始值渲染

除对象外,模板也可接收字符串、数值等原始类型,此时需用 {{.}} 指代当前上下文:

Mustache.render('当前计数: {{.}}', 42);        // "当前计数: 42"
Mustache.render('{{.}}', ['a', 'b']);           // 隐式转字符串 "a,b"

更实用的场景是传入函数实现动态计算:

const template = '生成时间: {{stamp}}';
const result = Mustache.render(template, {
  stamp: () => new Date().toLocaleString('zh-CN')
});

外部模板文件加载方案

生产环境通常将模板抽离为独立文件,借助 jquery.mustache.js 扩展实现异步加载:

// 目录结构: templates/user-card.mustache
// 加载并渲染
$.Mustache
  .load('templates/user-card.mustache')
  .done(function () {
    const html = $.Mustache.render('user-card', {
      members: [
        { nickname: '林夕', role: '架构师' },
        { nickname: '南风', role: '全栈开发' }
      ]
    });
    document.getElementById('app').insertAdjacentHTML('beforeend', html);
  });

封装通用加载器以提升复用性:

const TemplateLoader = {
  cache: new Map(),
  
  async fetch(tplName) {
    if (this.cache.has(tplName)) {
      return this.cache.get(tplName);
    }
    const res = await fetch(`templates/${tplName}.mustache`);
    const text = await res.text();
    this.cache.set(tplName, text);
    return text;
  },
  
  async renderTo(selector, tplName, viewModel) {
    const raw = await this.fetch(tplName);
    const fragment = Mustache.render(raw, viewModel);
    document.querySelector(selector).innerHTML = fragment;
  }
};

// 调用
TemplateLoader.renderTo('#dashboard', 'report-table', {
  rows: await fetchReportData()
});

模板安全与转义策略

默认 {{html}} 会对特殊字符做 HTML 实体编码,若需输出富文本使用三花括号:

<script id="tmpl-article" type="text/template">
  <article>
    <h1>{{title}}</h1>
    <div>{{{richContent}}}</div>  <!-- 信任源数据时启用 -->
  </article>
</script>

建议配合 DOMPurify 等库对 {{{}}} 输入做净化处理,防范 XSS 风险。

返回列表

上一篇:ggalt扩展包在ggplot2中的高级可视化应用

没有最新的文章了...

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。