Files
MokoOnyx/wiki/minification.md
T
Jonathan Miller 3a30f1a088
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (push) Successful in 6s
Universal: PR Check / Branch Policy (pull_request) Successful in 3s
Generic: Repo Health / Access control (pull_request) Successful in 3s
Universal: Auto Version Bump / Version Bump (push) Failing after 14s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 12s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 11s
Universal: PR Check / Validate PR (pull_request) Failing after 10s
Update Server / Update Server (push) Successful in 18s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 35s
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Generic: Repo Health / Release configuration (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Merge remote-tracking branch 'origin/main' into dev
# Conflicts:
#	.mokogitea/cascade-dev.yml
#	src/templateDetails.xml
#	updates.xml
2026-05-30 20:51:21 -05:00

4.2 KiB

← Back to Home

Minification

MokoOnyx includes an automatic CSS/JS minification system that generates .min files at runtime based on the development mode setting.


How It Works

The minification system is implemented in MokoMinifyHelper (helper/minify.php). It is called from the template's index.php on every page load and follows a simple rule:

  • Development mode OFF (production): .min files are generated from source files when the source is newer or the .min file is missing
  • Development mode ON: all .min files are deleted so the browser loads unminified source files for debugging

Files Managed

CSS Files

Source File Minified Output
css/template.css css/template.min.css
css/offline.css css/offline.min.css
css/editor.css css/editor.min.css
css/a11y-high-contrast.css css/a11y-high-contrast.min.css
css/user.css css/user.min.css
css/theme/light.standard.css css/theme/light.standard.min.css
css/theme/dark.standard.css css/theme/dark.standard.min.css
css/theme/light.custom.css css/theme/light.custom.min.css
css/theme/dark.custom.css css/theme/dark.custom.min.css

JavaScript Files

Source File Minified Output
js/template.js js/template.min.js
js/gtm.js js/gtm.min.js
js/user.js js/user.min.js

All paths are relative to media/templates/site/mokoonyx/.


Staleness Check

The system uses filesystem modification times to determine whether a .min file needs regenerating:

  1. If the source file does not exist, skip it
  2. If the .min file exists and its modification time is newer or equal to the source, skip it
  3. Otherwise, read the source, minify it, and write the .min file

This means minification only runs when source files actually change, keeping page load overhead minimal.


CSS Minification

The CSS minifier performs these transformations:

  1. Remove CSS comments (preserving IE hacks)
  2. Remove whitespace around { } : ; , > + ~
  3. Collapse remaining whitespace to single spaces
  4. Remove trailing semicolons before closing braces (;} becomes })
  5. Strip leading/trailing whitespace

JavaScript Minification

The JS minifier performs these transformations:

  1. Remove multi-line comments (/* ... */)
  2. Remove single-line comments (//) while preserving URLs
  3. Collapse whitespace
  4. Remove spaces around operators and punctuation
  5. Restore necessary spaces after keywords (var, let, const, return, typeof, instanceof, new, delete, throw, case, in, of)

Build-Time vs Runtime

Context What Happens
Runtime (page load) MokoMinifyHelper::sync() runs on every page load. In production mode, it checks timestamps and regenerates stale .min files. The overhead is negligible (filesystem stat calls only when files have not changed).
Build-time (make build) The Makefile runs make minify before packaging. This uses the moko-platform minify.js script (Node.js) with terser and clean-css for higher-quality minification.
Install/Update The installer script (script.php) deletes all .min.css and .min.js files in the css/ and js/ directories so they are cleanly regenerated by the runtime minifier on the first page load. Vendor .min files in vendor/ are not touched.

Debug Mode Behaviour

To debug CSS or JS issues:

  1. Go to System → Site Templates → MokoOnyx
  2. Open the Advanced tab
  3. Set Development Mode to Yes
  4. Save

This immediately deletes all .min files. The template will load the unminified source files, making browser DevTools inspection straightforward. Remember to turn development mode off for production.


Built with moko-platform -- Moko Consulting


Repo: MokoOnyx · moko-platform

Revision Date Author Description
1.0 2026-05-09 Moko Consulting Initial version