模板引擎简介 #

一、什么是模板引擎? #

1.1 定义 #

模板引擎是一种将模板文件和数据结合生成HTML的工具。它允许你使用变量、条件、循环等逻辑来动态生成页面。

1.2 工作原理 #

text
模板文件 + 数据 = HTML输出
javascript
app.set('view engine', 'ejs');

app.get('/', (req, res) => {
    res.render('index', { title: '首页', user: '张三' });
});

二、常用模板引擎 #

2.1 Express支持的模板引擎 #

引擎 说明 特点
EJS 嵌入式JavaScript 语法简单,类似HTML
Pug 缩进式模板 简洁,不写标签
Handlebars 逻辑少模板 安全,分离关注点
Nunjucks 模板继承 功能强大
Mustache 无逻辑模板 简单通用

2.2 选择建议 #

场景 推荐引擎
简单项目 EJS
追求简洁 Pug
团队协作 Handlebars
复杂布局 Nunjucks
多语言支持 Mustache

三、配置模板引擎 #

3.1 设置视图引擎 #

javascript
app.set('view engine', 'ejs');

3.2 设置视图目录 #

javascript
app.set('views', path.join(__dirname, 'views'));

3.3 自定义视图目录 #

javascript
app.set('views', [
    path.join(__dirname, 'views'),
    path.join(__dirname, 'templates')
]);

四、渲染模板 #

4.1 res.render() #

javascript
app.get('/', (req, res) => {
    res.render('index', { title: '首页' });
});

4.2 传递数据 #

javascript
app.get('/user/:id', (req, res) => {
    res.render('user', {
        title: '用户详情',
        userId: req.params.id,
        user: {
            name: '张三',
            email: 'zhangsan@example.com'
        },
        items: ['项目1', '项目2', '项目3']
    });
});

4.3 使用app.locals #

全局变量:

javascript
app.locals.siteName = '我的网站';
app.locals.version = '1.0.0';

app.get('/', (req, res) => {
    res.render('index');
});

模板中可直接使用 siteNameversion

4.4 使用res.locals #

请求级变量:

javascript
app.use((req, res, next) => {
    res.locals.user = req.user || null;
    res.locals.isAuthenticated = !!req.user;
    next();
});

app.get('/dashboard', (req, res) => {
    res.render('dashboard');
});

五、模板缓存 #

5.1 开发环境 #

javascript
if (process.env.NODE_ENV === 'development') {
    app.set('view cache', false);
}

5.2 生产环境 #

javascript
if (process.env.NODE_ENV === 'production') {
    app.set('view cache', true);
}

六、错误处理 #

6.1 模板不存在 #

javascript
app.get('/page', (req, res, next) => {
    res.render('nonexistent', (err, html) => {
        if (err) {
            return next(err);
        }
        res.send(html);
    });
});

6.2 渲染错误 #

javascript
app.use((err, req, res, next) => {
    console.error('模板错误:', err);
    res.status(500).send('模板渲染失败');
});

七、EJS快速示例 #

7.1 安装 #

bash
npm install ejs

7.2 配置 #

javascript
app.set('view engine', 'ejs');

7.3 模板文件 #

views/index.ejs:

html
<!DOCTYPE html>
<html>
<head>
    <title><%= title %></title>
</head>
<body>
    <h1><%= message %></h1>
    <ul>
        <% items.forEach(item => { %>
            <li><%= item %></li>
        <% }); %>
    </ul>
</body>
</html>

7.4 路由 #

javascript
app.get('/', (req, res) => {
    res.render('index', {
        title: '首页',
        message: '欢迎',
        items: ['项目1', '项目2']
    });
});

八、Pug快速示例 #

8.1 安装 #

bash
npm install pug

8.2 配置 #

javascript
app.set('view engine', 'pug');

8.3 模板文件 #

views/index.pug:

pug
doctype html
html
    head
        title= title
    body
        h1= message
        ul
            each item in items
                li= item

8.4 路由 #

javascript
app.get('/', (req, res) => {
    res.render('index', {
        title: '首页',
        message: '欢迎',
        items: ['项目1', '项目2']
    });
});

九、总结 #

模板引擎要点:

概念 说明
视图引擎 app.set(‘view engine’, ‘ejs’)
视图目录 app.set(‘views’, path)
渲染方法 res.render(‘template’, data)
全局变量 app.locals
请求变量 res.locals

下一步,让我们深入学习EJS模板!

最后更新:2026-03-28