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}`);
});

解释

  1. 缓存对象:我们创建了一个名为 cache 的对象,用于存储已渲染的页面。
  2. 中间件:定义了一个名为 cacheMiddleware 的中间件函数,用于处理缓存逻辑。
    • 首先,我们获取请求路径对应的 .ejs 文件路径。
    • 然后检查缓存中是否已经存在该页面。如果存在,则直接发送缓存的 HTML 内容。
    • 如果缓存中不存在,则使用 ejs.renderFile 渲染页面,并将结果存储到缓存中。
  3. 使用中间件:在应用中使用 cacheMiddleware 中间件。
  4. 路由:定义了一个简单的路由 /,用于渲染 index.ejs 页面。

通过这种方式,你可以有效地缓存生成的 HTML 页面,从而提高应用的性能。注意,这里的缓存是基于文件路径的,如果你需要更复杂的缓存策略(如时间戳、版本控制等),可以在缓存机制上进一步扩展。


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 渲染的结果,避免每次请求都重新渲染。
  • 文件系统缓存:将渲染结果保存到文件系统中,后续请求时直接读取文件,减轻服务器负担。

这两种方法都可以有效地提高应用性能,具体选择哪种取决于你的应用场景和需求。

回到顶部