Skip to content

gios/gzipper

Repository files navigation

Gzipper

Support Ukraine Badge Build Status npm version

A tool for compressing files by means of Deflate, Brotli, gzip, Zopfli and zstd algorithms, works seamlessly with many CLI UI tools (Angular CLI, Vue CLI, create-react-app).

The flexibility of the algorithms could be extended by many options, including the --gzip-level, --gzip-strategy, --gzip-memory-level, --brotli-param-mode, --brotli-quality, --brotli-size-hint. All options can be declared via ENV variables (ENV variables have higher priority over CLI arguments).

You can enable --verbose mode for better visual representation, customize your file output using --output-file-format or compress with --incremental option if you have a lot of files that rarely change.

By default gzipper compress all the files but you could use --include or --exclude options for flexibility.

Install

  • Globally

    npm i gzipper -g

  • Locally to devDependencies.

    npm i gzipper -D

Usage

gzipper

Usage: gzipper [options] [command] Options: -V, --version output the version number -h, --help display help for command Commands: compress|c [options] <path> [outputPath] compress selected path and optionally set output directory cache manipulations with cache help [command] display help for command

compress|c

Usage: gzipper compress|c [options] <path> [outputPath] compress selected path and optionally set output directory Options: -v, --verbose detailed level of logs --incremental incremental compression -e, --exclude <extensions> exclude file extensions from compression, example: jpeg,jpg... -i, --include <extensions> include file extensions for compression, example: js,css,html... -t, --threshold <number> exclude assets smaller than this byte size. 0 (default) --deflate enable deflate compression --brotli enable brotli compression --gzip enable gzip compression --zopfli enable zopfli compression --zstd enable zstd compression --gzip-level <number> gzip compression level 6 (default), 0 (no compression) - 9 (best compression) --gzip-memory-level <number> amount of memory which will be allocated for gzip compression 8 (default), 1 (minimum memory) - 9 (maximum memory) --gzip-strategy <number> gzip compression strategy 0 (default), 1 (filtered), 2 (huffman only), 3 (RLE), 4 (fixed) --deflate-level <number> deflate compression level 6 (default), 0 (no compression) - 9 (best compression) --deflate-memory-level <number> amount of memory which will be allocated for deflate compression 8 (default), 1 (minimum memory) - 9 (maximum memory) --deflate-strategy <number> deflate compression strategy 0 (default), 1 (filtered), 2 (huffman only), 3 (RLE), 4 (fixed) --brotli-param-mode <value> default, text (for UTF-8 text), font (for WOFF 2.0 fonts) --brotli-quality <number> brotli compression quality 11 (default), 0 - 11 --brotli-size-hint <number> expected input size 0 (default) --zopfli-num-iterations <number> maximum amount of times to rerun forward and backward pass to optimize LZ77 compression cost --zopfli-block-splitting splits the data in multiple deflate blocks with optimal choice for the block boundaries --zopfli-block-splitting-max <number> maximum amount of blocks to split into (0 for unlimited, but this can give extreme results that hurt compression on some files) --zstd-level <number> zstd compression level 1 (default), 5 (best compression) --output-file-format <value> output file format with default artifacts [filename].[ext].[compressExt] --remove-larger remove compressed files if they larger than uncompressed originals --skip-compressed skip compressed files if they already exist --workers <number> numbers of workers which will be spawned, system CPU cores count - 1 (default) --no-color disable logger colorful messages -h, --help display help for command

cache

Usage: gzipper cache [options] [command] manipulations with cache Options: -h, --help display help for command Commands: purge purge cache storage size size of cached resources help [command] display help for command

Examples

CLI

  • Globally usage

    gzipper compress [options] <path> [outputPath]

  • Locally usage

    1. Add module to scripts in your package.json and run compress command npm run compress

       "scripts": { "gzipper": "gzipper", "compress": "gzipper compress ./src" }
    2. Use npx command

       "scripts": { "compress": "npx gzipper compress ./src" }
  • UI build tools (e.g. Angular CLI)

     "scripts": { "build": "ng build && gzipper compress ./src" }
  • Compress files to a certain directory ./dist (folders structure inside src will be saved)

     "scripts": { "compress": "gzipper compress ./src ./dist" }
  • Compress files to very deep folder ./very/deep/folder/dist (all folders will be automatically created if not exist)

     "scripts": { "compress": "gzipper compress ./src ./very/deep/folder/dist" }
  • Compress a single file

     "scripts": { "compress": "gzipper compress ./src/awesomeness.txt" }

Node.js Module

import { Compress } from "gzipper"; const gzip = new Compress('./src', './dist', { verbose: true, brotli: true, }); try { const files = await gzip.run(); console.info('Compressed files: ', files); } catch (err) { console.error(err); }

Options

compress|c

CLI argument ENV variable
--incremental GZIPPER_INCREMENTAL (0 or 1)
-v, --verbose GZIPPER_VERBOSE (0 or 1)
-e, --exclude <extensions> GZIPPER_EXCLUDE
-i, --include <extensions> GZIPPER_INCLUDE
-t, --threshold <number> GZIPPER_THRESHOLD
--gzip GZIPPER_GZIP (0 or 1)
--deflate GZIPPER_DEFLATE (0 or 1)
--brotli GZIPPER_BROTLI (0 or 1)
--zopfli GZIPPER_ZOPFLI (0 or 1)
--zstd GZIPPER_ZSTD (0 or 1)
--gzip-level <number> GZIPPER_GZIP_LEVEL
--gzip-memory-level <number> GZIPPER_GZIP_MEMORY_LEVEL
--gzip-strategy <number> GZIPPER_GZIP_STRATEGY
--deflate-level <number> GZIPPER_DEFLATE_LEVEL
--deflate-memory-level <number> GZIPPER_DEFLATE_MEMORY_LEVEL
--deflate-strategy <number> GZIPPER_DEFLATE_STRATEGY
--brotli-param-mode <value> GZIPPER_BROTLI_PARAM_MODE
--brotli-quality <number> GZIPPER_BROTLI_QUALITY
--brotli-size-hint <number> GZIPPER_BROTLI_SIZE_HINT
--zopfli-num-iterations <number> GZIPPER_ZOPFLI_NUM_ITERATIONS
--zopfli-block-splitting GZIPPER_ZOPFLI_BLOCK_SPLITTING (0 or 1)
--zopfli-block-splitting-max <number> GZIPPER_ZOPFLI_BLOCK_SPLITTING_MAX
--zstd-level <number> GZIPPER_ZSTD_LEVEL
--output-file-format <value> GZIPPER_OUTPUT_FILE_FORMAT
--remove-larger GZIPPER_REMOVE_LARGER (0 or 1)
--skip-compressed GZIPPER_SKIP_COMPRESSED (0 or 1)
--workers <number> GZIPPER_WORKERS
--no-color GZIPPER_NO_COLOR or NO_COLOR (0 or 1)

ENV variables have higher priority over CLI arguments.

--incremental

gzipper c ./src --incremental

A special type of compression that significantly decreases the time of compression (on the second run) if you have a lot of big and rarely updated files. It creates a .gzipper folder with pre-compressed files (cache) and config that stores all necessary metadata (.gzipperconfig).

-v, --verbose

gzipper c ./src --verbose

Get more information about executed work. (Could increase time of compression because of gathering additional metrics)

-e, --exclude <extensions>

gzipper c ./src --exclude jpeg,jpg,png,ico

Exclude file extensions from compression. Compression extensions br, gz, zz and zst are excluded by default.

-i, --include <extensions>

gzipper c ./src --include js,css,html

Include file extensions for compression (exclude others).

-t, --threshold <number>

gzipper c ./src --threshold 900

Exclude assets smaller than this byte size. Default is 0 byte.

--gzip

gzipper c ./src --gzip

Enable gzip compression. (default behavior)

--deflate

gzipper c ./src --deflate

Enable Deflate compression.

--brotli

gzipper c ./src --brotli

Enable Brotli compression.

--zopfli

gzipper c ./src --zopfli

Enable Zopfli compression.

--zstd

gzipper c ./src --zstd

Enable Zstandard compression.

--gzip-level <number>

gzipper c ./src --gzip-level 8

gzip compression level: 6 (default), 0 (no compression) - 9 (best compression). Only for --gzip.

--gzip-memory-level <number>

gzipper c ./src --gzip-memory-level 2

Amount of memory that will be allocated for gzip compression: 8 (default), 1 (minimum memory) - 9 (maximum memory). Only for --gzip.

--gzip-strategy <number>

gzipper c ./src --gzip-strategy 3

gzip compression strategy: 0 (default), 1 (filtered), 2 (huffman only), 3 (RLE), 4 (fixed). Only for --gzip.

--deflate-level <number>

gzipper c ./src --deflate-level 8

Deflate compression level: 6 (default), 0 (no compression) - 9 (best compression). Only for --deflate.

--deflate-memory-level <number>

gzipper c ./src --deflate-memory-level 2

Amount of memory that will be allocated for deflate compression: 8 (default), 1 (minimum memory) - 9 (maximum memory). Only for --deflate.

--deflate-strategy <number>

gzipper c ./src --deflate-strategy 3

Deflate compression strategy: 0 (default), 1 (filtered), 2 (huffman only), 3 (RLE), 4 (fixed). Only for --deflate.

--brotli-param-mode <value>

gzipper c ./src --brotli-param-mode text

Available values are: text (for UTF-8 text, default) and font (for WOFF 2.0 fonts). Only for --brotli.

--brotli-quality <number>

gzipper c ./src --brotli-quality 10

Brotli compression quality: 11 (default), 0 - 11. Only for --brotli.

--brotli-size-hint <number>

gzipper c ./src --brotli-size-hint 6

Estimated total input size for all files to compress: 0 (default, which means that the size is unknown). Only for --brotli.

--zopfli-num-iterations <number>

gzipper c ./src --zopfli-num-iterations 15

Maximum amount of times to rerun forward and backward pass to optimize LZ77 compression cost. Good values: 10, 15 for small files, 5 for files over several MB in size or it will be too slow. Only for --zopfli.

--zopfli-block-splitting

gzipper c ./src --zopfli-block-splitting

If true, splits the data in multiple deflate blocks with optimal choice for the block boundaries. Block splitting gives better compression. Only for --zopfli.

--zopfli-block-splitting-max <number>

gzipper c ./src --zopfli-block-splitting-max 5

Maximum amount of blocks to split into. 0 for unlimited, but this can give extreme results that hurt compression on some files. Only for --zopfli.

--zstd-level <number>

gzipper c ./src --zstd-level 8

Zstd compression level: 1 (default), 5 (best compression). Only for --zstd.

--output-file-format <value>

Output file format with artifacts, default format: [filename].[ext].[compressExt]. Where: filename -> name of your file, ext -> file extension, compressExt -> compress extension (.gz, .br, etc), hash -> uniq hash.

Example: Expected project structure.

img rabbit.jpg cat.jpg js main.js modules.js xml main.xml index.js 
  • gzipper c ./src --output-file-format [filename].[compressExt].[ext]

    img rabbit.jpg rabbit.gz.jpg cat.jpg cat.gz.jpg js main.js main.gz.js modules.js modules.gz.js xml main.xml main.gz.xml index.js index.gz.js 
  • gzipper c ./src --output-file-format test-[filename]-[hash].[compressExt].[ext]

    img rabbit.jpg cat.jpg test-rabbit-b4564011-ba7c-4bd6-834d-bf6c7791b7d4.gz.jpg test-cat-739c7d7d-53ca-4f8e-912c-bad3b2b515a9.gz.jpg js main.js modules.js test-main-4cc35dbd-36f7-4889-9f41-4d93e7a25bef.gz.js test-modules-bce90cbd-5bf2-43c2-8b61-33aa1599b704.gz.js xml main.xml test-main-a90fa10e-f7a4-4af9-af67-f887bb96f98b.gz.xml index.js test-index-067c1e2d-0e12-4b57-980b-97c880c24d57.gz.js 
  • gzipper c ./src --output-file-format [filename]-[hash]-[filename]-tmp.[ext].[compressExt]

    img rabbit.jpg rabbit-b4564011-ba7c-4bd6-834d-bf6c7791b7d4-rabbit-tmp.jpg.gz cat.jpg cat-739c7d7d-53ca-4f8e-912c-bad3b2b515a9cat-tmp.jpg.gz js main.js main-4cc35dbd-36f7-4889-9f41-4d93e7a25bef-main-tmp.js.gz modules.js modules-bce90cbd-5bf2-43c2-8b61-33aa1599b704-modules-tmp.js.gz xml main.xml main-a90fa10e-f7a4-4af9-af67-f887bb96f98b-main-tmp.xml.gz index.js index-067c1e2d-0e12-4b57-980b-97c880c24d57-index-tmp.js.gz 

--remove-larger

Removes compressed files larger than uncompressed originals in your directory.

--skip-compressed

Ignores compressed files that have already exist in your directory. Only with default --output-file-format.

--workers <number>

Spawn workers for parallel compression. Be aware of workers number because every worker creates an additional thread. More info at nodesource.com.

--no-color

Disable logger colorful messages.

cache

Command
purge
size

purge

gzipper cache purge

Removes all pre-compressed files from cache that was generated via --incremental argument.

size

gzipper cache size

Returns the size of all pre-compiled files from cache.

Changelog

CHANGELOG.md

Contribution

I appreciate every contribution, just fork the repository and send the pull request with your changes.

Support

  • Node.js >= 20.11.0

Prerequisites

If you want to use --zstd compression, you have to make sure that the appropriate library is installed and available at your environment:

where zstd.exe # Windows command -v zstd # MacOS/Linux

If you didn't find executable zstd you have to install this manually:

  • MacOS using Brew

    brew install zstd # zstd only brew install zlib # whole library
  • Windows Subsystem for Linux (WSL), Ubuntu, Debian... using APT

    sudo apt install zstd

Sponsor this project

Packages

 
 
 

Contributors

Languages