Nodejs ejs模板语言相关,有没一些缓存方面的用法
Nodejs ejs模板语言相关,有没一些缓存方面的用法
想在一段时间里面缓存成静态的样子,想请教一下有没什么合适的方案。
        
          3 回复
        
      
      
        当然可以!在使用 Node.js 和 EJS 模板引擎时,缓存生成的 HTML 页面可以帮助提高性能。下面是一个简单的示例,展示如何实现这一点。
示例代码
首先,确保你已经安装了 EJS 模块:
npm install ejs
接下来,创建一个简单的 Express 应用来演示缓存机制:
const express = require('express');
const ejs = require('ejs');
const fs = require('fs');
const path = require('path');
const app = express();
const PORT = process.env.PORT || 3000;
// 设置 EJS 作为视图引擎
app.set('view engine', 'ejs');
// 缓存对象,用于存储已渲染的页面
const cache = {};
// 定义一个中间件来处理缓存逻辑
function cacheMiddleware(req, res, next) {
  const filePath = path.join(__dirname, 'views', req.path + '.ejs');
  // 检查缓存中是否存在该页面
  if (cache[filePath]) {
    res.send(cache[filePath]);
  } else {
    // 如果缓存中不存在,则渲染页面并存储到缓存中
    ejs.renderFile(filePath, {}, (err, html) => {
      if (err) return next(err);
      cache[filePath] = html;
      res.send(html);
    });
  }
}
// 使用中间件
app.use(cacheMiddleware);
// 定义一个路由
app.get('/', (req, res) => {
  res.render('index', { title: 'Home Page' });
});
// 启动服务器
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
解释
- 缓存对象:我们创建了一个名为 
cache的对象,用于存储已渲染的页面。 - 中间件:定义了一个名为 
cacheMiddleware的中间件函数,用于处理缓存逻辑。- 首先,我们获取请求路径对应的 
.ejs文件路径。 - 然后检查缓存中是否已经存在该页面。如果存在,则直接发送缓存的 HTML 内容。
 - 如果缓存中不存在,则使用 
ejs.renderFile渲染页面,并将结果存储到缓存中。 
 - 首先,我们获取请求路径对应的 
 - 使用中间件:在应用中使用 
cacheMiddleware中间件。 - 路由:定义了一个简单的路由 
/,用于渲染index.ejs页面。 
通过这种方式,你可以有效地缓存生成的 HTML 页面,从而提高应用的性能。注意,这里的缓存是基于文件路径的,如果你需要更复杂的缓存策略(如时间戳、版本控制等),可以在缓存机制上进一步扩展。
redis呗
Node.js EJS 模板语言缓存方案
在使用 EJS 模板引擎时,有时我们希望将生成的静态页面缓存起来,以减少对数据库或文件系统的频繁访问。以下是一些常用的缓存方案,包括内存缓存和文件系统缓存。
1. 使用内存缓存
你可以使用 memory-cache 这样的库来缓存 EJS 渲染的结果。
const express = require('express');
const ejs = require('ejs');
const memCache = require('memory-cache');
const app = express();
app.get('/page', (req, res) => {
    const cachedPage = memCache.get('cachedPage');
    if (cachedPage) {
        console.log('Using cached page');
        return res.send(cachedPage);
    }
    ejs.renderFile('./views/page.ejs', { data: 'Some Data' }, {}, (err, str) => {
        if (err) {
            console.error(err);
            return res.status(500).send('Rendering error');
        }
        
        memCache.put('cachedPage', str, 60 * 1000); // 缓存1分钟
        res.send(str);
    });
});
app.listen(3000, () => {
    console.log('Server running on port 3000');
});
2. 使用文件系统缓存
另一种方法是将渲染后的页面保存到文件系统中,并在后续请求时直接读取该文件。
const express = require('express');
const ejs = require('ejs');
const fs = require('fs');
const app = express();
app.get('/page', (req, res) => {
    const filePath = './cache/page.html';
    fs.access(filePath, fs.constants.F_OK, (err) => {
        if (!err) {
            console.log('Using cached file');
            return res.sendFile(filePath);
        }
        ejs.renderFile('./views/page.ejs', { data: 'Some Data' }, {}, (err, str) => {
            if (err) {
                console.error(err);
                return res.status(500).send('Rendering error');
            }
            fs.writeFileSync(filePath, str);
            res.send(str);
        });
    });
});
app.listen(3000, () => {
    console.log('Server running on port 3000');
});
解释
- 内存缓存:使用 
memory-cache库缓存 EJS 渲染的结果,避免每次请求都重新渲染。 - 文件系统缓存:将渲染结果保存到文件系统中,后续请求时直接读取文件,减轻服务器负担。
 
这两种方法都可以有效地提高应用性能,具体选择哪种取决于你的应用场景和需求。
        
      
                    
                  
                    
