Jadual Kandungan
Melihat hasil penyahmampatan/mampatan, di sini gunakan
流(stream) menggunakan
BufferMenggunakan
基于流(stream)操作
基于Buffer操作
Node Server中的实践
BrotliCompress
测试数据
404: ${url}
已注册路由
Rumah hujung hadapan web tutorial js Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Mar 08, 2022 pm 08:00 PM
node

Bagaimana untuk mencapai pemampatan kandungan menggunakan Nodejs? Artikel berikut akan bercakap tentang kaedah melaksanakan pemampatan kandungan (gzip/br/deflate) di bahagian Node melalui amalan saya harap ia akan membantu anda!

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Apabila menyemak log aplikasi saya, saya mendapati ia sentiasa mengambil masa beberapa saat untuk dimuatkan selepas memasuki halaman log (antara muka tidak penomboran). Jadi saya membuka panel rangkaian dan menyemak

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

hanya untuk mendapati bahawa data yang dikembalikan oleh antara muka tidak dimampatkan menyangka antara muka menggunakan proksi terbalik Nginx , Nginx secara automatik akan membantu saya melakukan lapisan ini (saya akan meneroka ini kemudian, secara teorinya boleh dilaksanakan)

Ujung belakang di sini ialah perkhidmatan Node >

Artikel ini adalah Kongsi

pengetahuan berkaitan dan prapengetahuan dalam HTTP数据压缩Node侧的实践

Pelanggan berikut semuanya merujuk kepada penyemak imbas

pengekodan terima

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Apabila klien memulakan permintaan ke pelayan, ia akan menambah medan

dalam pengepala permintaan dan nilainya menunjukkan klien accept-encodingformat支持的压缩内容编码

pengekodan kandungan

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Selepas pelayan melakukan pemampatan pada kandungan yang dikembalikan, ia memberitahu penyemak imbas dengan menambahkan

pada respons pengepala. Kandungan bekas content-encoding实际压缩使用的编码算法

deflate/gzip/br

ialah algoritma pemampatan data tanpa kehilangan yang menggunakan kedua-dua algoritma deflate dan LZ77. 哈夫曼编码(Huffman Coding)

ialah algoritma berdasarkan gzip DEFLATE

merujuk kepada br Format data ini direka untuk meningkatkan lagi nisbah mampatan dan boleh memampatkan teks secara relatif Brotli Tingkatkan ketumpatan mampatan deflate, manakala kelajuan mampatan dan penyahmampatannya kekal hampir tidak berubah20%

modul zlib

Node.js mengandungi

, yang menyediakan penggunaan zlib 模块, dan GzipDeflate/InflateBrotliDi sini kami mengambil

sebagai contoh untuk menyenaraikan pelbagai kaedah penggunaan mengikut senario

dan gzip digunakan dengan cara yang sama , tetapi API berbezaDeflate/Inflate Brotli

Operasi berdasarkan

stream

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

Operasi berdasarkan

buffer

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihanMemperkenalkan beberapa modul yang diperlukan

Menyahkod/memampatkan fail
const zlib = require('zlib')
const fs = require('fs')
const stream = require('stream')
const testFile = 'tests/origin.log'
const targetFile = `${testFile}.gz`
const decodeFile = `${testFile}.un.gz`
Salin selepas log masuk

Melihat hasil penyahmampatan/mampatan, di sini gunakan

perintah untuk mengira terus penyahmampatan Sebelum dan selepas keputusan

du

berdasarkan
# 执行
du -ah tests

# 结果如下
108K    tests/origin.log.gz
2.2M    tests/origin.log
2.2M    tests/origin.log.un.gz
4.6M    tests
Salin selepas log masuk
operasi

流(stream) menggunakan

dengan

createGzipcreateUnzip

NOTA: Semua
    API kecuali API yang disegerakkan secara eksplisit semuanya menggunakan kumpulan benang dalaman Node.js, yang boleh dianggap sebagai tak segerak
  • zlib Oleh itu, kod mampatan dan penyahmampatan dalam contoh berikut hendaklah dilaksanakan secara berasingan, jika tidak, ralat akan dilaporkan
Kaedah 1:

Terus gunakan kaedah pada contoh untuk lulus strim pipe

// 压缩
const readStream = fs.createReadStream(testFile)
const writeStream = fs.createWriteStream(targetFile)
readStream.pipe(zlib.createGzip()).pipe(writeStream)

// 解压
const readStream = fs.createReadStream(targetFile)
const writeStream = fs.createWriteStream(decodeFile)
readStream.pipe(zlib.createUnzip()).pipe(writeStream)
Salin selepas log masuk
Kaedah 2 :

Gunakan pada , anda boleh melakukan pemprosesan lain secara berasingan dalam panggilan balik streampipeline

// 压缩
const readStream = fs.createReadStream(testFile)
const writeStream = fs.createWriteStream(targetFile)
stream.pipeline(readStream, zlib.createGzip(), writeStream, err => {
    if (err) {
        console.error(err);
    }
})

// 解压
const readStream = fs.createReadStream(targetFile)
const writeStream = fs.createWriteStream(decodeFile)
stream.pipeline(readStream, zlib.createUnzip(), writeStream, err => {
    if (err) {
        console.error(err);
    }
})
Salin selepas log masuk
Kaedah 3:

Promise kaedah pipeline

Operasi berdasarkan
const { promisify } = require('util')
const pipeline = promisify(stream.pipeline)

// 压缩
const readStream = fs.createReadStream(testFile)
const writeStream = fs.createWriteStream(targetFile)
pipeline(readStream, zlib.createGzip(), writeStream)
    .catch(err => {
        console.error(err);
    })

// 解压
const readStream = fs.createReadStream(targetFile)
const writeStream = fs.createWriteStream(decodeFile)
pipeline(readStream, zlib.createUnzip(), writeStream)
    .catch(err => {
        console.error(err);
    })
Salin selepas log masuk

BufferMenggunakan

dan

API, kedua-dua kaedah ini termasuk gzip dan unzip jenis 同步异步

Mampatan
    • gzip
    • gzipSync
    Nyahzip
    • unzip
    • unzipSync
Kaedah 1:

Tukar kepada , dan kemudian lakukan operasi selanjutnya readStreamBuffer

gzip: tak segerak
// 压缩
const buff = []
readStream.on('data', (chunk) => {
    buff.push(chunk)
})
readStream.on('end', () => {
    zlib.gzip(Buffer.concat(buff), targetFile, (err, resBuff) => {
        if(err){
            console.error(err);
            process.exit()
        }
        fs.writeFileSync(targetFile,resBuff)
    })
})
Salin selepas log masuk
gzipSync: Segerakkan
// 压缩
const buff = []
readStream.on('data', (chunk) => {
    buff.push(chunk)
})
readStream.on('end', () => {
    fs.writeFileSync(targetFile,zlib.gzipSync(Buffer.concat(buff)))
})
Salin selepas log masuk
Kaedah 2:

Baca terus readFileSync penyahmampatan /mampatan kandungan teks melalui

>
// 压缩
const readBuffer = fs.readFileSync(testFile)
const decodeBuffer = zlib.gzipSync(readBuffer)
fs.writeFileSync(targetFile,decodeBuffer)

// 解压
const readBuffer = fs.readFileSync(targetFile)
const decodeBuffer = zlib.gzipSync(decodeFile)
fs.writeFileSync(targetFile,decodeBuffer)
Salin selepas log masuk
Selain pemampatan fail, kadangkala ia mungkin perlu untuk menyahmampatkan kandungan yang dipindahkan secara langsung

这里以压缩文本内容为例

// 测试数据
const testData = fs.readFileSync(testFile, { encoding: 'utf-8' })
Salin selepas log masuk

基于流(stream)操作

这块就考虑 string => buffer => stream的转换就行

string => buffer

const buffer = Buffer.from(testData)
Salin selepas log masuk
Salin selepas log masuk

buffer => stream

const transformStream = new stream.PassThrough()
transformStream.write(buffer)

// or
const transformStream = new stream.Duplex()
transformStream.push(Buffer.from(testData))
transformStream.push(null)
Salin selepas log masuk

这里以写入到文件示例,当然也可以写到其它的流里,如HTTP的Response(后面会单独介绍)

transformStream
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream(targetFile))
Salin selepas log masuk

基于Buffer操作

同样利用Buffer.from将字符串转buffer

const buffer = Buffer.from(testData)
Salin selepas log masuk
Salin selepas log masuk

然后直接使用同步API进行转换,这里result就是压缩后的内容

const result = zlib.gzipSync(buffer)
Salin selepas log masuk

可以写入文件,在HTTP Server中也可直接对压缩后的内容进行返回

fs.writeFileSync(targetFile, result)
Salin selepas log masuk

Node Server中的实践

这里直接使用Node中 http 模块创建一个简单的 Server 进行演示

在其他的 Node Web 框架中,处理思路类似,当然一般也有现成的插件,一键接入

Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan

const http = require('http')
const { PassThrough, pipeline } = require('stream')
const zlib = require('zlib')

// 测试数据
const testTxt = '测试数据123'.repeat(1000)

const app = http.createServer((req, res) => {
    const { url } = req
    // 读取支持的压缩算法
    const acceptEncoding = req.headers['accept-encoding'].match(/(br|deflate|gzip)/g)

    // 默认响应的数据类型
    res.setHeader('Content-Type', 'application/json; charset=utf-8')

    // 几个示例的路由
    const routes = [
        ['/gzip', () => {
            if (acceptEncoding.includes('gzip')) {
                res.setHeader('content-encoding', 'gzip')
                // 使用同步API直接压缩文本内容
                res.end(zlib.gzipSync(Buffer.from(testTxt)))
                return
            }
            res.end(testTxt)
        }],
        ['/deflate', () => {
            if (acceptEncoding.includes('deflate')) {
                res.setHeader('content-encoding', 'deflate')
                // 基于流的单次操作
                const originStream = new PassThrough()
                originStream.write(Buffer.from(testTxt))
                originStream.pipe(zlib.createDeflate()).pipe(res)
                originStream.end()
                return
            }
            res.end(testTxt)
        }],
        ['/br', () => {
            if (acceptEncoding.includes('br')) {
                res.setHeader('content-encoding', 'br')
                res.setHeader('Content-Type', 'text/html; charset=utf-8')
                // 基于流的多次写操作
                const originStream = new PassThrough()
                pipeline(originStream, zlib.createBrotliCompress(), res, (err) => {
                    if (err) {
                        console.error(err);
                    }
                })
                originStream.write(Buffer.from(&#39;<h1 id="BrotliCompress">BrotliCompress</h1>&#39;))
                originStream.write(Buffer.from(&#39;<h2 id="测试数据">测试数据</h2>&#39;))
                originStream.write(Buffer.from(testTxt))
                originStream.end()
                return
            }
            res.end(testTxt)
        }]
    ]
    const route = routes.find(v => url.startsWith(v[0]))
    if (route) {
        route[1]()
        return
    }

    // 兜底
    res.setHeader(&#39;Content-Type&#39;, &#39;text/html; charset=utf-8&#39;)
    res.end(`<h1 id="nbsp-url">404: ${url}</h1>
    <h2 id="已注册路由">已注册路由</h2>
    <ul>
        ${routes.map(r => `<li><a href="${r[0]}">${r[0]}</a></li>`).join(&#39;&#39;)}
    </ul>
    `)
    res.end()
})

app.listen(3000)
Salin selepas log masuk

更多node相关知识,请访问:nodejs 教程

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara menggunakan Node untuk mencapai pemampatan kandungan melalui latihan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk memadam nod dalam nvm Bagaimana untuk memadam nod dalam nvm Dec 29, 2022 am 10:07 AM

Cara memadam nod dengan nvm: 1. Muat turun "nvm-setup.zip" dan pasangkannya pada pemacu C 2. Konfigurasikan pembolehubah persekitaran dan semak nombor versi melalui arahan "nvm -v" 3. Gunakan "nvm arahan install" Pasang nod; 4. Padamkan nod yang dipasang melalui arahan "nvm uninstall".

Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod Mar 28, 2023 pm 07:28 PM

Bagaimana untuk mengendalikan muat naik fail? Artikel berikut akan memperkenalkan kepada anda cara menggunakan ekspres untuk mengendalikan muat naik fail dalam projek nod saya harap ia akan membantu anda!

Bagaimana untuk melakukan pencerminan Docker perkhidmatan Node? Penjelasan terperinci tentang pengoptimuman melampau Bagaimana untuk melakukan pencerminan Docker perkhidmatan Node? Penjelasan terperinci tentang pengoptimuman melampau Oct 19, 2022 pm 07:38 PM

Dalam tempoh ini, saya sedang membangunkan perkhidmatan dinamik HTML yang biasa kepada semua kategori dokumen Tencent Untuk memudahkan penjanaan dan penggunaan akses kepada pelbagai kategori, dan untuk mematuhi trend beralih ke awan, saya sedang mempertimbangkan. menggunakan Docker untuk membetulkan kandungan perkhidmatan dan mengurus versi produk secara seragam. Artikel ini akan berkongsi pengalaman pengoptimuman yang saya kumpulkan dalam proses perkhidmatan Docker untuk rujukan anda.

Analisis mendalam tentang alat pengurusan proses Node 'pm2' Analisis mendalam tentang alat pengurusan proses Node 'pm2' Apr 03, 2023 pm 06:02 PM

Artikel ini akan berkongsi dengan anda alat pengurusan proses Node "pm2", dan bercakap tentang mengapa pm2 diperlukan, cara memasang dan menggunakan pm2, saya harap ia akan membantu semua orang!

PI Node Teaching: Apakah nod pi? Bagaimana cara memasang dan menyediakan nod pi? PI Node Teaching: Apakah nod pi? Bagaimana cara memasang dan menyediakan nod pi? Mar 05, 2025 pm 05:57 PM

Penjelasan dan Panduan Pemasangan Terperinci untuk Pinetwork Nodes Artikel ini akan memperkenalkan ekosistem pinetwork secara terperinci - nod pi, peranan utama dalam ekosistem pinetwork, dan menyediakan langkah -langkah lengkap untuk pemasangan dan konfigurasi. Selepas pelancaran Rangkaian Ujian Blockchain Pinetwork, nod PI telah menjadi bahagian penting dari banyak perintis yang aktif mengambil bahagian dalam ujian, bersiap sedia untuk pelepasan rangkaian utama yang akan datang. Jika anda tidak tahu kerja pinet, sila rujuk apa itu picoin? Berapakah harga untuk penyenaraian? Penggunaan PI, perlombongan dan analisis keselamatan. Apa itu Pinetwork? Projek Pinetwork bermula pada tahun 2019 dan memiliki syiling pi cryptocurrency eksklusifnya. Projek ini bertujuan untuk mewujudkan satu yang semua orang boleh mengambil bahagian

Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Mari kita bincangkan tentang cara menggunakan pkg untuk membungkus projek Node.js ke dalam fail boleh laku. Dec 02, 2022 pm 09:06 PM

Bagaimana untuk membungkus fail boleh laku nodejs dengan pkg? Artikel berikut akan memperkenalkan kepada anda cara menggunakan pkg untuk membungkus projek Node ke dalam fail boleh laku. Saya harap ia akan membantu anda!

Pengesahan berasaskan token dengan Angular dan Node Pengesahan berasaskan token dengan Angular dan Node Sep 01, 2023 pm 02:01 PM

Pengesahan adalah salah satu bahagian terpenting dalam mana-mana aplikasi web. Tutorial ini membincangkan sistem pengesahan berasaskan token dan cara ia berbeza daripada sistem log masuk tradisional. Pada penghujung tutorial ini, anda akan melihat demo berfungsi sepenuhnya yang ditulis dalam Angular dan Node.js. Sistem Pengesahan Tradisional Sebelum beralih kepada sistem pengesahan berasaskan token, mari kita lihat sistem pengesahan tradisional. Pengguna memberikan nama pengguna dan kata laluan mereka dalam borang log masuk dan klik Log Masuk. Selepas membuat permintaan, sahkan pengguna di bahagian belakang dengan menanyakan pangkalan data. Jika permintaan itu sah, sesi dibuat menggunakan maklumat pengguna yang diperoleh daripada pangkalan data dan maklumat sesi dikembalikan dalam pengepala respons supaya ID sesi disimpan dalam penyemak imbas. Menyediakan akses kepada aplikasi tertakluk kepada

Bagaimana untuk mengkonfigurasi dan memasang node.js dalam IDEA? Analisis ringkas kaedah Bagaimana untuk mengkonfigurasi dan memasang node.js dalam IDEA? Analisis ringkas kaedah Dec 21, 2022 pm 08:28 PM

Bagaimana untuk menjalankan nod dalam IDEA? Artikel berikut akan memperkenalkan kepada anda cara mengkonfigurasi, memasang dan menjalankan node.js dalam IDEA Saya harap ia akan membantu anda!

See all articles