検索
ホームページウェブフロントエンドjsチュートリアルNode を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう

Nodejs を使用してコンテンツ圧縮を実現するにはどうすればよいですか?以下の記事では、Node側でコンテンツ圧縮(gzip/br/deflate)を実装する方法を実践しながら解説していきますので、ご参考になれば幸いです。

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう

アプリケーションのログを確認すると、ログ ページに入ってからロードするのに常に数秒かかることがわかりました (インターフェイスはページ分割されていません)。そこで、ネットワーク パネルを開いて、

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう

# を確認したところ、インターフェイスから返されたデータが圧縮されていないことがわかりました。インターフェイスには Nginx リバース プロキシが使用されていると考えられました。Nginx はこのレイヤーの実行を自動的に支援します (これについては後で検討します。理論的には実現可能です)

ここでのバックエンドは Node Service

です。

この記事では、HTTP データ圧縮関連の知識と ノード側での実践を共有します

事前知識

次の内容クライアントはすべてブラウジングを指します

accept-encoding

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう

クライアントがサーバーへのリクエストを開始すると、リクエストに ## が追加されます#accept-encoding フィールドの値は、クライアントがサポートする圧縮コンテンツ エンコーディング 形式 content-encoding

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう を示します。

サーバーは、返されたコンテンツの圧縮を実行した後、応答ヘッダーに

content-encoding を追加することで、コンテンツの実際の圧縮に使用されるエンコード アルゴリズム をブラウザーに伝えます。 deflate/gzip/br

deflate

は、LZ77 アルゴリズムと ハフマン コーディング ロスレス データ圧縮アルゴリズムの両方を使用するものです。

gzip

は、DEFLATE に基づくアルゴリズムです。

br

は、データ Brotli を参照します。 format 圧縮率をさらに向上させることを目的として、テキストを圧縮すると、deflate に比べて圧縮密度が 20% 増加しますが、圧縮速度と解凍速度はほぼ変わりません zlib module

Node.js には、

Gzip

Deflate/InflateBrotli へのアクセスを提供する zlib モジュールが含まれています 実装された圧縮関数 ここでは

gzip

を例に、シナリオに応じたさまざまな利用方法を列挙します。 Brotli ですが、API は異なります stream

に基づく操作

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょうbuffer に基づく

操作

必要なモジュールをいくつか紹介

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`
Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょうファイルを解凍/圧縮する

Unzip/ 圧縮結果を表示するには、ここで

du

コマンドを使用して、解凍前後の結果を直接カウントします。

# 执行
du -ah tests

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

stream(stream)## に基づく操作

# createGzip および createUnzip

注: 明示的に同期される API を除く、すべての zlib API , Node.js の内部スレッド プールを使用します。非同期とみなされます

    したがって、次の例の圧縮コードと解凍コードは別々に実行する必要があります。そうしないとエラーが報告されます
  • 方法 1:
  • サンプルを直接使用する
  • // 压缩
    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)

pipe メソッドを使用する 方法 2: pipeline

を使用する

stream で返される 他の処理を個別に実行する

// 压缩
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);
    }
})
メソッド 3: Promiseizationpipeline

Method

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);
    })
Operation Buffer

gzip および unzip

API に基づいて、これら 2 つのメソッドには

synchronousasynchronous# が含まれます##types 圧縮gzip

    • gzipSync
    • 解凍
    • unzip
  • ##unzipSync
    • 方法 1:
    • readStreamTransfer
    • Buffer
    を実行し、さらに操作を実行します

gzip: 非同期

// 压缩
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)
    })
})
gzipSync: synchronous
// 压缩
const buff = []
readStream.on('data', (chunk) => {
    buff.push(chunk)
})
readStream.on('end', () => {
    fs.writeFileSync(targetFile,zlib.gzipSync(Buffer.concat(buff)))
})

    方法 2:
  • readFileSync
を通じて直接読み取り、
    // 压缩
    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)
のテキスト コンテンツを復号化/圧縮します。ファイル圧縮に加えて、送信されたコンテンツを直接解凍することが必要になる場合があります

这里以压缩文本内容为例

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

基于流(stream)操作

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

string =>  buffer

const buffer = Buffer.from(testData)

buffer => stream

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

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

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

transformStream
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream(targetFile))

基于Buffer操作

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

const buffer = Buffer.from(testData)

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

const result = zlib.gzipSync(buffer)

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

fs.writeFileSync(targetFile, result)

Node Server中的实践

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

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

Node を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょう

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)

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

以上がNode を使用してコンテンツ圧縮を実現する方法を実践しながら話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は掘金社区で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター