H3-compression
Handles compression for H3
Features
✔️ Zlib Compression: You can use zlib compression (brotli, gzip and deflate)
✔️ Stream Compression: You can use native stream compressions (gzip, deflate)
✔️ Compression Detection: It uses the best compression which is accepted
Install
npm install h3-compression
yarn add h3-compression
pnpm add h3-compression
Usage
import { createServer } from 'node:http'
import { createApp, eventHandler, toNodeListener } from 'h3'
import { useCompressionStream } from 'h3-compression'
const app = createApp({ onBeforeResponse: useCompressionStream })
app.use(
'/',
eventHandler(() => 'Hello world!'),
)
createServer(toNodeListener(app)).listen(process.env.PORT || 3000)
Example using listhen for an elegant listener:
import { createApp, eventHandler, toNodeListener } from 'h3'
import { listen } from 'listhen'
import { useCompressionStream } from 'h3-compression'
const app = createApp({ onBeforeResponse: useCompressionStream })
app.use(
'/',
eventHandler(() => 'Hello world!'),
)
listen(toNodeListener(app))
Nuxt 3
If you want to use it in nuxt 3 you can define a nitro plugin.
server/plugins/compression.ts
import { useCompression } from 'h3-compression'
export default defineNitroPlugin((nitro) => {
nitro.hooks.hook('render:response', async (response, { event }) => {
if (!response.headers?.['content-type'].startsWith('text/html'))
return
await useCompression(event, response)
})
})
[!NOTE]
useCompressionStream
doesn't work right now in nitro. So you just can use useCompression
Utilities
H3-compression has a concept of composable utilities that accept event
(from eventHandler((event) => {})
) as their first argument and response
as their second.
Zlib Compression
useGZipCompression(event, response)
useDeflateCompression(event, response)
useBrotliCompression(event, response)
useCompression(event, response)
Stream Compression
useGZipCompressionStream(event, response)
useDeflateCompressionStream(event, response)
useCompressionStream(event, response)
Releated Projects
License
MIT License © 2023-PRESENT Gregor Becker