検索
ホームページウェブフロントエンドjsチュートリアルNode.js を使用して圧縮および解凍関数を実装する

Node.js を使用して圧縮および解凍関数を実装する

Jun 06, 2018 am 09:27 AM
nodenodejs圧縮解凍する

この記事では主に Node.js をベースにした圧縮と解凍の方法を紹介しますので、参考にしてください。

圧縮形式

zip と gzip は、私たちが目にする 2 つの最も一般的な圧縮形式です。もちろん、Windows では gzip が使用されることはほとんどありません。

tar は、デフォルトでは圧縮されないアーカイブ形式で、最終的な tar ファイルを gzip 形式の tar.gz ファイルに圧縮するには、gzip と組み合わせる必要があります。通常、これは tgz と省略されます。

なぜ rar について言及されていないのですか?これは特許で保護されたアルゴリズムであるため、解凍ツールは無料で入手できますが、圧縮ツールは有料です。したがって、一般的なアプリケーション シナリオでは、rar 圧縮ファイルが提供されることはほとんどありません。

この記事では、Node.jsでgzip、tar、tgz、zipを圧縮・解凍する方法をそれぞれ紹介します。

非圧縮ファイル ライブラリ

この記事で使用されている非圧縮ファイル ライブラリは urllib から取得したもので、最初にそれを複製し、指定されたディレクトリに移動する必要があります。

git clone https://github.com/node-modules/urllib.git nodejs-compressing-demo

gzip

Linux の世界では、各ツールの責任は非常に純粋で単一になります。 gzip として使用すると、ファイルが圧縮されるだけです。フォルダーがどのようにパッケージ化され、圧縮されるかについては、tar が担当するものではありません。

ファイルを圧縮する gzip コマンドライン

たとえば、nodejs-compressing-demo/lib/urllib.js ファイルを gzip 圧縮する場合は、urllib.js.gz ファイルとソース ファイルを取得します。削除されます。

$ ls -l nodejs-compressing-demo/lib/urllib.js
-rw-r--r-- 1 a a 31318 Feb 12 11:27 nodejs-compressing-demo/lib/urllib.js

$ gzip nodejs-compressing-demo/lib/urllib.js

$ ls -l nodejs-compressing-demo/lib/urllib.js.gz
-rw-r--r-- 1 a a 8909 Feb 12 11:27 nodejs-compressing-demo/lib/urllib.js.gz

# 还原压缩文件
$ gunzip nodejs-compressing-demo/lib/urllib.js.gz

ファイル サイズが 31318 バイトから 8909 バイトに減少し、3.5 倍以上の圧縮効果が得られました。

cat コマンドと組み合わせたパイプメソッドを使用して、ファイルを任意のファイルとして圧縮して保存することもできます:

$ ls -l nodejs-compressing-demo/README.md
-rw-r--r-- 1 a a 13747 Feb 12 11:27 nodejs-compressing-demo/README.md

$ cat nodejs-compressing-demo/README.md | gzip > README.md.gz

$ ls -l README.md.gz
-rw-r--r-- 1 a a 4903 Feb 12 11:50 README.md.gz

Node.js は gzip を実装します

もちろん、gzip アルゴリズムとツールを実際に実装するわけではありません。 Node.js の世界では、これらの基本ライブラリがすでに用意されているので、そのまま使用するだけです。

この記事では、圧縮モジュールを使用してすべての圧縮コードと解凍コードを実装します。

なぜ圧縮を選択するのですか?十分なコード品質と単体テストが保証されており、アクティブなメンテナンス状態にあり、非常に使いやすい API を備え、ストリーミング インターフェイスもサポートしているためです。

Promise インターフェイス

const compressing = require('compressing');

// 选择 gzip 格式,然后调用 compressFile 方法
compressing.gzip.compressFile('nodejs-compressing-demo/lib/urllib.js', 'nodejs-compressing-demo/lib/urllib.js.gz')
 .then(() => {
  console.log('success');
 })
 .catch(err => {
  console.error(err);
 });

// 解压缩是反响过程,接口都统一为 uncompress
compressing.gzip.uncompress('nodejs-compressing-demo/lib/urllib.js.gz', 'nodejs-compressing-demo/lib/urllib.js2')
 .then(() => {
  console.log('success');
 })
 .catch(err => {
  console.error(err);
 });

async/await プログラミング モデルと組み合わせると、コードは通常の非同期 IO 操作として記述できます。

const compressing = require('compressing');

async function main() {
 try {
  await compressing.gzip.compressFile('nodejs-compressing-demo/lib/urllib.js',
   'nodejs-compressing-demo/lib/urllib.js.gz');
  console.log('success');
 } catch (err) {
  console.error(err);
 }

 // 解压缩
 try {
  await compressing.gzip.uncompress('nodejs-compressing-demo/lib/urllib.js.gz',
   'nodejs-compressing-demo/lib/urllib.js2');
  console.log('success');
 } catch (err) {
  console.error(err);
 }
}

main();

ストリームインターフェース

ストリームモードでプログラミングする場合、各ストリームのエラーイベントを処理し、すべてのストリームを手動で破棄する必要があることに特別な注意が必要です。

fs.createReadStream('nodejs-compressing-demo/lib/urllib.js')
 .on('error', handleError)
 .pipe(new compressing.gzip.FileStream()) // It's a transform stream
 .on('error', handleError)
 .pipe(fs.createWriteStream('nodejs-compressing-demo/lib/urllib.js.gz2'))
 .on('error', handleError);

// 解压缩,就是 pipe 的方向倒转过来
fs.createReadStream('nodejs-compressing-demo/lib/urllib.js.gz2')
 .on('error', handleError)
 .pipe(new compressing.gzip.UncompressStream()) // It's a transform stream
 .on('error', handleError)
 .pipe(fs.createWriteStream('nodejs-compressing-demo/lib/urllib.js3'))
 .on('error', handleError);

公式のストリームでのバックプレッシャリングの推奨事項によると、ポンプ モジュールを使用してストリーム モード プログラミングと連携し、ポンプにこれらのストリームのクリーニング作業を完了させる必要があります。

const pump = require('pump');

const source = fs.createReadStream('nodejs-compressing-demo/lib/urllib.js');
const target = fs.createWriteStream('nodejs-compressing-demo/lib/urllib.js.gz2');

pump(source, new compressing.gzip.FileStream(), target, err => {
 if (err) {
  console.error(err);
 } else {
  console.log('success');
 }
});

// 解压缩
pump(fs.createReadStream('nodejs-compressing-demo/lib/urllib.js.gz2'),
  new compressing.gzip.FileStream(),
  fs.createWriteStream('nodejs-compressing-demo/lib/urllib.js3'),
  err => {
 if (err) {
  console.error(err);
 } else {
  console.log('success');
 }
});

Stream インターフェースの利点

Stream インターフェースは Promise インターフェースよりもはるかに複雑に見えますが、なぜこのようなアプリケーション シナリオがあるのでしょうか。

実際、HTTP サービスの分野では、HTTP リクエスト自体がリクエスト ストリームであるため、ストリーム モデルの方が大きな利点があります。アップロードされたファイルを gzip 圧縮して返したい場合、アップロードされたファイルを保存する必要はありません。代わりに、このファイル ストリームを直接使用して、Stream インターフェイスを使用してファイルをローカル ディスクに保存します。

egg ファイルのアップロード用のサンプル コードを使用して、gzip 圧縮を実装し、わずかな変更を加えて返すことができます。

const pump = require('pump');

class UploadFormController extends Controller {
 // ... other codes

 async upload() {
  const stream = await this.ctx.getFileStream();
  // 直接将压缩流赋值给 ctx.body,实现边压缩边返回的流式响应
  this.ctx.body = pump(stream, new compressing.gzip.FileStream());
 }
}

tar | gzip > tgz

gzip Chapter tar がフォルダーのパッケージ化を担当することを事前に知ることができます。

たとえば、nodejs-compressing-dem o フォルダー全体をファイルにパッケージ化して他の人に送信したい場合は、tar コマンドを使用できます。

$ tar -c -f nodejs-compressing-demo.tar nodejs-compressing-demo/

$ ls -l nodejs-compressing-demo.tar
-rw-r--r-- 1 a a 206336 Feb 12 14:01 nodejs-compressing-demo.tar

ご覧のとおり、tar でパッケージ化されたファイルは非圧縮であり、そのサイズが実際のフォルダーの合計サイズに近いため、通常はさらに大きくなります。そこで、梱包と同時に全員で圧縮していきます。

$ tar -c -z -f nodejs-compressing-demo.tgz nodejs-compressing-demo/

$ ls -l nodejs-compressing-demo.tgz
-rw-r--r-- 1 a a 39808 Feb 12 14:07 nodejs-compressing-demo.tgz

tar と tgz のサイズの差は 5 倍以上あり、ネットワーク伝送帯域幅が大幅に減少する可能性があります。

Node.js は tgz

Promise インターフェイスを実装します

まず、compressing.tar.compressDir(sourceDir, targetFile) を使用してフォルダーを tar ファイルにパッケージ化し、次に上記の gzip 圧縮方法を使用して、 tar ファイル ファイルは tgz ファイルに圧縮されます。

const compressing = require('compressing');

compressing.tar.compressDir('nodejs-compressing-demo', 'nodejs-compressing-demo.tar')
 .then(() => {
  return compressing.gzip.compressFile('nodejs-compressing-demo.tar',
   'nodejs-compressing-demo.tgz');
 });
 .then(() => {
  console.log('success');
 })
 .catch(err => {
  console.error(err);
 });

// 解压缩
compressing.gzip.uncompress('nodejs-compressing-demo.tgz', 'nodejs-compressing-demo.tar')
 .then(() => {
  return compressing.tar.uncompress('nodejs-compressing-demo.tar',
   'nodejs-compressing-demo2');
 });
 .then(() => {
  console.log('success');
 })
 .catch(err => {
  console.error(err);
 });

async/await プログラミング モデルと組み合わせると、コードが読みやすくなります:

const compressing = require('compressing');

async function main() {
 try {
  await compressing.tar.compressDir('nodejs-compressing-demo',
   'nodejs-compressing-demo.tar');
  await compressing.gzip.compressFile('nodejs-compressing-demo.tar',
   'nodejs-compressing-demo.tgz');
  console.log('success');
 } catch (err) {
  console.error(err);
 }
 
 // 解压缩
 try {
  await compressing.gzip.uncompress('nodejs-compressing-demo.tgz',
   'nodejs-compressing-demo.tar');
  await compressing.tar.uncompress('nodejs-compressing-demo.tar',
   'nodejs-compressing-demo2');
  console.log('success');
 } catch (err) {
  console.error(err);
 }
}

main();

Stream インターフェイス

compressing.tar.Stream クラスを通じて、任意のファイルとフォルダーを tar ストリームに動的に追加できます。オブジェクト、非常に柔軟です。

const tarStream = new compressing.tar.Stream();
// dir
tarStream.addEntry('dir/path/to/compress');
// file
tarStream.addEntry('file/path/to/compress');
// buffer
tarStream.addEntry(buffer);
// stream
tarStream.addEntry(stream);

const destStream = fs.createWriteStream('path/to/destination.tgz');
pump(tarStream, new compressing.gzip.FileStream(), destStream, err => {
 if (err) {
  console.error(err);
 } else {
  console.log('success');
 }
});

zip

zip は、実際には tar + gzip の「商用」の組み合わせと見なすことができ、ユーザーは圧縮ファイルと圧縮フォルダーを区別する必要がなくなります。

zip コマンド ライン ツールを使用してフォルダーを圧縮する例:

$ zip -r nodejs-compressing-demo.zip nodejs-compressing-demo/
 adding: nodejs-compressing-demo/ (stored 0%)
 adding: nodejs-compressing-demo/test/ (stored 0%)
 ...
 adding: nodejs-compressing-demo/.travis.yml (deflated 36%)

$ ls -l nodejs-compressing-demo.*
-rw-r--r-- 1 a a 206336 Feb 12 14:06 nodejs-compressing-demo.tar
-rw-r--r-- 1 a a  39808 Feb 12 14:07 nodejs-compressing-demo.tgz
-rw-r--r-- 1 a a  55484 Feb 12 14:34 nodejs-compressing-demo.zip

tgz と zip のファイル サイズを比較すると、デフォルトの圧縮パラメーターの下では gzip の方が zip よりも優れた効果があることがわかります。

Node.js は zip を実装します

実装コードは tar と似ていますが、デフォルトで圧縮されており、gzip プロセスを追加する必要がない点が異なります。

えー

概要

Node.js に基づく圧縮と解凍は思ったより簡単ですか?巨大な npm のおかげで、コマンド ライン ツールを使用して簡単にプログラミングを体験できます。

Promise インターフェイスでも Stream インターフェイスでも、最適なシナリオがあります。それを選択しますか?

現時点で、圧縮および解凍機能を使用すると、どのようなサービスや機能が実行できるでしょうか?

上記は私があなたのためにまとめたものです。

関連記事:

tween.jsを使用してイージングトゥイーンアニメーションアルゴリズムを実装する

Reactのrefの詳細な説明(詳細なチュートリアル)

JSを介してテキストの断続的なループスクロール効果を実現する方法

以上がNode.js を使用して圧縮および解凍関数を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
ブラウザを超えて:現実世界の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コンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptをインストールするにはどうすればよいですか?JavaScriptをインストールするにはどうすればよいですか?Apr 05, 2025 am 12:16 AM

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

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 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません