如果你不只想返回 JSON,而是想让服务器直接渲染 HTML 页面,就会用到模板引擎。
这像什么?
像老城区有一家印刷铺,你给它一份模板和一批数据,它帮你印成完整公告。
#1. 模板的意义
不是写死 HTML:
<h1>道路列表</h1>
<ul>
<li>中山主路</li>
<li>复兴大道</li>
</ul>而是写一个带占位符的“公文模板”,让服务器把真实数据塞进去。
#2. Express 中的基本思路
const express = require('express');
const path = require('node:path');
const app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.get('/roads-page', (req, res) => {
res.render('roads', {
title: '老城区主干道列表',
roads: ['中山主路', '复兴大道', '和平街']
});
});views/roads.ejs
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title><%= title %></title>
</head>
<body>
<h1><%= title %></h1>
<ul>
<% roads.forEach(road => { %>
<li><%= road %></li>
<% }) %>
</ul>
</body>
</html>#3. 模板引擎适合什么场景
适合:
- 管理后台
- 简单内容站
- 服务器渲染页面
- 传统多页应用
不一定适合:
- 前后端完全分离的大型 SPA
- 前端已由 React / Vue / Next / Nuxt 承担页面渲染
#4. res.locals 是什么
可以把它当作:
这次办事流程里,临时放在窗口桌面上的公共资料。
app.use((req, res, next) => {
res.locals.cityName = '老城区';
next();
});
app.get('/notice', (req, res) => {
res.render('notice');
});