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 渲染的结果,避免每次请求都重新渲染。 - 文件系统缓存:将渲染结果保存到文件系统中,后续请求时直接读取文件,减轻服务器负担。
这两种方法都可以有效地提高应用性能,具体选择哪种取决于你的应用场景和需求。