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