Skip to content
On this page

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

注意事项

  1. 必须在 koa-conditional-get 之后使用
  2. 合理设置缓存策略,配合 Cache-Control 使用
  3. 注意流式响应的处理
  4. 避免对动态内容生成 ETag
  5. 考虑使用弱 ETag 来提高性能
  6. 注意 ETag 生成的性能开销

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命