Appearance
koa-etag
简介
koa-etag是一个用于生成和验证 ETag 的 Koa 中间件,它可以帮助实现浏览器缓存,提高应用性能。ETag 是一个唯一标识符,用于标识资源的特定版本。
安装
bash
npm install koa-etag基本使用
javascript
const Koa = require('koa');
const etag = require('koa-etag');
const conditional = require('koa-conditional-get');
const app = new Koa();
// 注意:etag 中间件需要配合 conditional-get 使用
app.use(conditional());
app.use(etag());
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);配置选项
javascript
app.use(etag({
weak: false // 是否使用弱 ETag
}));自定义 ETag 生成
javascript
app.use(etag({
hash: (body, encoding) => {
// 自定义 ETag 生成逻辑
return require('crypto')
.createHash('md5')
.update(body, encoding)
.digest('hex');
}
}));与其他中间件配合
javascript
const Koa = require('koa');
const etag = require('koa-etag');
const conditional = require('koa-conditional-get');
const compress = require('koa-compress');
const app = new Koa();
// 按照正确的顺序使用中间件
app.use(conditional());
app.use(etag());
app.use(compress());
app.use(async ctx => {
ctx.body = '大量文本内容...';
});缓存控制
javascript
app.use(async (ctx, next) => {
// 设置缓存控制头
ctx.set('Cache-Control', 'public, max-age=3600');
await next();
});流式响应处理
javascript
const fs = require('fs');
app.use(async ctx => {
// 对于流式响应,ETag 会自动处理
ctx.body = fs.createReadStream('large-file.txt');
});注意事项
- 必须在 koa-conditional-get 之后使用
- 合理设置缓存策略,配合 Cache-Control 使用
- 注意流式响应的处理
- 避免对动态内容生成 ETag
- 考虑使用弱 ETag 来提高性能
- 注意 ETag 生成的性能开销