You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不重启Express.js服务器且保留view cache的情况下重载模板视图?

在不重启Express.js服务器且保持view cache开启的情况下重载HBS视图

可以实现,核心思路是手动清除Express和HBS的视图缓存,无需重启服务器或关闭缓存。以下是具体方案:

原理说明

当开启view cache后,Express会将编译后的模板函数存储在app.cache对象中(键为模板绝对路径),同时HBS自身也会维护一个编译缓存hbs.cache。清空这两个缓存后,下一次res.render会重新读取模板文件并编译,从而加载最新修改。

实现代码

完整修改后的示例

const express = require('express');
const path = require('path');
const hbs = require('hbs');

const app = express();

// 视图引擎配置
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.set('view cache', true); // 保持缓存开启

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

app.post('/api-endpoint', async (req, res) => {
    // 长时间运行的进程
    setTimeout(() => {
        console.log('done!');
    }, 3000);    
    res.send('Processing started');
});

// 安全内部刷新接口(建议添加鉴权)
app.post('/refresh-views', async (req, res) => {
    // 清空Express视图缓存
    app.cache = {};
    // 清空HBS自身编译缓存
    hbs.cache = {};
    return res.status(203).end();
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

针对性刷新特定模板

如果不需要清空所有缓存,只想刷新指定模板(比如index.hbs),可以修改刷新接口为:

app.post('/refresh-views', async (req, res) => {
    const targetTemplate = path.join(app.get('views'), 'index.hbs');
    // 删除Express缓存中的目标模板
    delete app.cache[targetTemplate];
    // 删除HBS缓存中的目标模板
    delete hbs.cache[targetTemplate];
    return res.status(203).end();
});

验证效果

  1. 启动服务器后,访问/page查看初始模板内容。
  2. 修改index.hbs文件,刷新/page看不到更新(因为缓存生效)。
  3. 调用/refresh-views接口(比如用Postman或curl)。
  4. 再次刷新/page,即可看到最新模板内容,同时/api-endpoint的长时进程会正常完成并输出done!。

注意事项

  • 务必给/refresh-views接口添加鉴权逻辑(比如验证请求头中的专属密钥),防止未授权操作。
  • 针对性刷新特定模板能减少性能损耗,适合模板更新频率不同的场景。

内容的提问来源于stack exchange,提问作者YarGnawh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:38:15