模板引擎
template-engines 概览。
25 分钟
模板引擎
从 数据 + 模板文件 生成文本(Markdown、SQL、YAML、源码)是 Node 脚本常见任务。本课概览 template-engines:Handlebars、EJS、Mustache 等——与 nva-glob 批处理组合成 codegen 流水线。
学习目标
- 理解逻辑-less vs 带 helper 的模板差异
- 用 Handlebars 渲染一次文件生成
- 知道何时 不要 用模板(应用层应用 Nest/Express)
为什么用模板
| 方式 | 问题 |
|---|---|
| 字符串拼接 | 引号/换行易错,难维护 |
| 模板引擎 | 结构清晰,数据与视图分离 |
Spring 侧有 Thymeleaf/Freemarker;Node CLI 侧 Handlebars / EJS 更常见。
Handlebars 示例
import Handlebars from "handlebars";
import fs from "node:fs/promises";
const tpl = await fs.readFile("templates/lesson.md.hbs", "utf8");
const compile = Handlebars.compile(tpl);
const md = compile({
title: "Node 与数据库",
slug: "nva-db",
links: [
{ href: "/tracks/postgresql-essentials", label: "PostgreSQL" },
{ href: "/tracks/mongodb-essentials", label: "MongoDB" },
],
});
await fs.writeFile("out/nva-db.md", md);
partials 可抽公共页眉;helpers 注册日期格式化等,避免模板里写 JS 逻辑过多。
引擎选型
| 引擎 | 特点 |
|---|---|
| Mustache | 无逻辑,极简 |
| Handlebars | Mustache 超集,helper |
| EJS | 嵌入 <% %> JS,灵活但易乱 |
| eta | 轻量,适合小工具 |
站点课时渲染走 MDX/Markdown(platform 层),不是本课模板栈;本课面向 生成 draft 或 migration 文件。
安全注意
- 模板数据来自 不可信输入 时,注意 HTML 转义(Handlebars 默认转义
{{}}) - 禁止
eval或 EJS 里执行任意用户代码 - 生成 SQL 仍要用 参数化(pg-intro),模板只生成 结构 不拼接用户 id
与 watch 联动
nva-watch 监听 templates/,变更时重新 compile 输出到 out/——本地预览 codegen 效果。