大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
模板引擎
从 数据 + 模板文件 生成文本(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 效果。
练习
- 做
lesson.md.hbs:含 title、summary、三条 bullet - 批量渲染 3 个 slug 到
out/ - 列一条:哪些字段适合模板,哪些必须运行时 API 拉取
小结
数据进模板,文本出文件;SQL 与 HTML 仍要转义与参数化。 下一课 Node 与数据库驱动。