Skip to content
On this page

hono-compress

简介

hono-compress 是 Hono 框架的响应压缩中间件,它可以自动压缩 HTTP 响应内容,减少传输数据量,提高应用性能和加载速度。该中间件支持 gzip、deflate 和 brotli 等常见压缩算法。

安装

bash
npm install hono @hono/compress

基本使用

typescript
import { Hono } from 'hono'
import { compress } from '@hono/compress'

const app = new Hono()

// 应用压缩中间件
app.use('*', compress())

app.get('/', (c) => {
  return c.text('Hello World'.repeat(1000)) // 大文本内容
})

app.get('/json', (c) => {
  // 大型 JSON 响应也会被压缩
  return c.json({ data: Array(1000).fill({ id: 1, name: 'Item' }) })
})

app.listen(3000)

高级配置

typescript
import { Hono } from 'hono'
import { compress } from '@hono/compress'

const app = new Hono()

// 自定义压缩配置
app.use(
  '*',
  compress({
    // 压缩阈值(字节),小于此值的响应不会被压缩
    threshold: 1024, // 默认为 1024 (1KB)

    // 支持的压缩算法
    encoding: ['gzip', 'deflate', 'br'],

    // 根据请求路径或内容类型决定是否压缩
    shouldCompress: (c) => {
      // 不压缩图片和视频
      const contentType = c.res.headers.get('Content-Type') || ''
      if (contentType.startsWith('image/') || contentType.startsWith('video/')) {
        return false
      }

      // 不压缩特定路径
      if (c.req.path.startsWith('/no-compress')) {
        return false
      }

      return true
    },

    // 压缩级别 (0-9),越高压缩率越高但消耗更多 CPU
    level: 6,
  }),
)

// 为不同路由使用不同的压缩配置
const apiCompressOptions = {
  threshold: 100, // API 响应通常较小,降低阈值
  level: 4, // 降低压缩级别,减少延迟
}

app.use('/api/*', compress(apiCompressOptions))

// 静态文件使用高压缩率
const staticCompressOptions = {
  threshold: 2048, // 静态文件较大时才压缩
  level: 9, // 最高压缩率
  encoding: ['br', 'gzip'], // 优先使用 brotli
}

app.use('/static/*', compress(staticCompressOptions))

注意事项

  1. 压缩会增加服务器 CPU 负载,对于高流量网站需要权衡压缩级别
  2. 小文件压缩可能反而增加总大小,建议设置合理的阈值(通常 1KB 以上)
  3. 某些文件类型(如图片、视频)已经是压缩格式,不应再次压缩
  4. 现代浏览器都支持 gzip 和 deflate,但 brotli (br) 支持可能有限
  5. 在生产环境中,可以考虑使用 CDN 或反向代理(如 Nginx)进行压缩,减轻应用服务器负担
  6. 确保客户端发送了 Accept-Encoding 头,否则压缩将不会生效

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