GitHub Action

Minify JavaScript, CSS, and HTML files directly in your GitHub workflows with detailed reporting.

Features

  • Bundled dependencies (fast startup)
  • PR comment reporting
  • Job summary with compression stats
  • File annotations for warnings
  • Benchmark comparison across compressors
  • Threshold enforcement (fail on size increase)
  • Support for 22+ compressors

Quick Start

- name: Minify JavaScript
  uses: srod/node-minify@v1
  with:
    input: "src/app.js"
    output: "dist/app.min.js"
    compressor: "terser"

Usage Examples

Basic Minification

name: Build
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Minify JS
        uses: srod/node-minify@v1
        with:
          input: "src/app.js"
          output: "dist/app.min.js"
          compressor: "terser"

With PR Comments

- name: Minify and Report
  uses: srod/node-minify@v1
  with:
    input: "src/app.js"
    output: "dist/app.min.js"
    compressor: "esbuild"
    type: "js"
    report-summary: "true"
    report-pr-comment: "true"
    github-token: ${{ secrets.GITHUB_TOKEN }}

CSS Minification

- name: Minify CSS
  uses: srod/node-minify@v1
  with:
    input: "src/styles.css"
    output: "dist/styles.min.css"
    compressor: "lightningcss"
    type: "css"

With Quality Gates

- name: Minify with Thresholds
  uses: srod/node-minify@v1
  with:
    input: "src/app.js"
    output: "dist/app.min.js"
    compressor: "terser"
    fail-on-increase: "true"
    min-reduction: "20"

Benchmark Comparison

- name: Benchmark Compressors
  uses: srod/node-minify@v1
  with:
    input: "src/app.js"
    output: "dist/app.min.js"
    compressor: "terser"
    benchmark: "true"
    benchmark-compressors: "terser,esbuild,swc,oxc"

Inputs

InputDescriptionRequiredDefault
inputFiles to minify (glob pattern or path)Yes-
outputOutput file pathYes-
compressorCompressor to useNoterser
typeFile type: js or cssNo-
optionsCompressor options (JSON)No{}
report-summaryAdd results to job summaryNotrue
report-pr-commentPost results as PR commentNofalse
report-annotationsAdd file annotationsNofalse
benchmarkRun benchmark comparisonNofalse
benchmark-compressorsCompressors to compareNoterser,esbuild,swc,oxc
fail-on-increaseFail if size increasesNofalse
min-reductionMinimum reduction % (0-100)No0
include-gzipInclude gzip sizesNotrue
working-directoryWorking directoryNo.
github-tokenToken for PR commentsNo-

Type Parameter

The type parameter is required for:

  • esbuild (specify js or css)
  • yui (specify js or css)

Available Compressors

JavaScript:

  • terser (recommended)
  • esbuild (fastest, requires type: js)
  • swc
  • oxc
  • uglify-js
  • google-closure-compiler / gcc (requires Java)

CSS:

  • lightningcss (recommended, CSS-only)
  • clean-css
  • cssnano
  • csso
  • esbuild (requires type: css)

HTML:

  • html-minifier
  • minify-html

JSON:

  • jsonminify

Image:

  • sharp (WebP/AVIF conversion)
  • svgo (SVG optimization)
  • imagemin (PNG/JPEG/GIF)

Other:

  • no-compress (passthrough)

Outputs

OutputDescription
original-sizeOriginal size in bytes
minified-sizeMinified size in bytes
reduction-percentSize reduction percentage
gzip-sizeGzipped size in bytes
time-msCompression time in ms
report-jsonFull report as JSON
benchmark-winnerBest compressor (if benchmark run)

Using Outputs

- name: Minify
  id: minify
  uses: srod/node-minify@v1
  with:
    input: "src/app.js"
    output: "dist/app.min.js"
    compressor: "terser"

- name: Show Results
  run: |
    echo "Original: ${{ steps.minify.outputs.original-size }} bytes"
    echo "Minified: ${{ steps.minify.outputs.minified-size }} bytes"
    echo "Reduction: ${{ steps.minify.outputs.reduction-percent }}%"

Advanced Examples

Google Closure Compiler

- name: Setup Java
  uses: actions/setup-java@v4
  with:
    distribution: "temurin"
    java-version: "17"

- name: Minify with GCC
  uses: srod/node-minify@v1
  with:
    input: "src/app.js"
    output: "dist/app.min.js"
    compressor: "gcc"
    options: '{"compilation_level": "ADVANCED_OPTIMIZATIONS"}'

HTML Minification

- name: Minify HTML
  uses: srod/node-minify@v1
  with:
    input: "src/index.html"
    output: "dist/index.html"
    compressor: "html-minifier"
    options: '{"collapseWhitespace": true, "removeComments": true}'

Multiple Files

- name: Minify JS bundle
  uses: srod/node-minify@v1
  with:
    input: "src/**/*.js"
    output: "dist/bundle.min.js"
    compressor: "terser"

- name: Minify CSS bundle
  uses: srod/node-minify@v1
  with:
    input: "src/**/*.css"
    output: "dist/styles.min.css"
    compressor: "lightningcss"
    type: "css"

Job Summary

When report-summary is enabled (default), the action adds a detailed summary to your workflow run showing:

  • Input/output files
  • Original and minified sizes
  • Compression percentage
  • Gzip size
  • Processing time

PR Comments

Enable report-pr-comment to automatically post compression results as a comment on pull requests. Requires github-token to be set.

Deprecation Notices

The following compressors are deprecated and will emit warnings:

DeprecatedUse Instead
babel-minifyterser
uglify-esterser
yuiterser (JS) or lightningcss (CSS)
crasslightningcss or clean-css
sqwishlightningcss or clean-css