壓縮格式
zip 和 gzip 是兩種我們最常見到的壓縮格式,當然,gzip 在 Windows 下很少有人接觸。
tar 是一種歸檔格式,它默認不會壓縮,需要結合 gzip 來將最終的 tar 文件以 gzip 格式壓縮成為一個 tar.gz 文件,通常我們會縮寫為 tgz。
為什么沒有提到 rar?因為它是專利保護的算法,你可以免費獲得解壓工具,而壓縮工具是需要付費的。所以我們一般應用場景下,很少會提供 rar 壓縮文件。
本文將分別介紹 gzip,tar,tgz 和 zip 的壓縮和解壓縮在 Node.js 下如何實現。
未壓縮文件庫
本文所使用的未壓縮文件庫來自于 urllib ,需要先 clone 它下來到指定目錄。
代碼如下:
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 倍的壓縮效果。
還可以通過 pipe 方式,結合 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 的世界,早已有人為你準備好這些基礎庫,我們只需要開箱即用。
本文將會使用 compressing 模塊,實現所有壓縮和解壓縮代碼。
為什么會選擇 compressing?因為它有足夠充分的代碼質量和單元測試保證,處于活躍的維護狀態,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); });// 解壓縮是反響過程,接口都統一為 uncompresscompressing.gzip.uncompress('nodejs-compressing-demo/lib/urllib.js.gz', 'nodejs-compressing-demo/lib/urllib.js2') .then(() => { console.log('success'); }) .catch(err => { console.error(err); });
|
新聞熱點
疑難解答
圖片精選