Быстрый минификатор JavaScript-проектов на Node.js: рекурсивно ищет файлы, копирует исходники в out-директорию и генерирует минифицированные версии. Поддерживает .js
, .mjs
, .cjs
, кэш по mtime, параллельную обработку и набор полезных флагов (баннеры, sourcemaps, обфускация).
- Рекурсивный обход каталогов с игнором (
node_modules
,dist
,build
,.vite
,coverage
,mini
и др.) - Поддержка расширений:
.js
,.mjs
,.cjs
- Пропуск уже минифицированных файлов
*.min.*
- Минификация через Terser
- Опциональная обфускация (
--obfuscate
) - Опциональные source maps (
--sourcemap
) - Сохранение лицензионных комментариев (
--keep-licenses
) - Параллельная обработка (
--concurrency
) - Простой кэш по времени модификации (ускоряет повторные запуски)
- Настраиваемый каталог вывода (
--out-dir
) - Защита от больших файлов (лимит 50MB)
- Улучшенная диагностика ошибок
- Node.js >= 18
- terser (используется для минификации)
Установить локальные зависимости в корне проекта:
npm i
# Базовый запуск (локально)
node minify.js <папка1> <папка2>
-h, --help Показать справку
--obfuscate Включить агрессивное переименование (mangle toplevel)
--sourcemap Генерировать source map для *.min.js
--keep-licenses Сохранять лицензионные комментарии (/*! ... */)
--fail-on-error Выход с кодом 1, если при обработке были ошибки
--no-copy-original Не копировать исходники в out (оставлять только *.min.*)
--no-overwrite-if-bigger Не перезаписывать *.min.*, если он больше/не меньше исходника
--banner "текст" Добавить баннер в начало минифицированного файла
--banner-file <файл> Прочитать баннер из файла (перекрывает --banner)
--ecma <год> Уровень ECMAScript для Terser (по умолчанию: 2019)
--out-dir <dir> Каталог вывода (по умолчанию: mini)
--ignore <a,b,c> Доп. игнорируемые папки (через запятую)
--concurrency <n> Кол-во параллельных задач (по умолчанию: кол-во CPU, [2..8])
# Минификация без обфускации в каталог mini/
node minify.js src/assets/js
# С обфускацией и sourcemap, пользовательский каталог вывода
node minify.js --obfuscate --sourcemap --out-dir mini src js
# Игнор дополнительных папок и ограничение параллельности
node minify.js --ignore .cache,temp --concurrency 4 src
# Только минифицированные файлы без копий исходников
node minify.js --no-copy-original src
# Пропуск перезаписи, если минифицированный файл не уменьшился
node minify.js --no-overwrite-if-bigger src
# Баннер из строки
node minify.js --banner "/*! MyLib v1.2.3 | MIT */" src
# Баннер из файла
node minify.js --banner-file ./HEADER.txt src
# Строже в CI: падать при ошибках, выставить уровень ECMAScript и sourcemaps
node minify.js --fail-on-error --ecma 2020 --sourcemap src
# Несколько входных каталогов и свой out-dir (вне входов)
node minify.js --out-dir build/js src/js libs
# out-dir внутри входной папки: добавьте его в --ignore, чтобы исключить повторный обход
node minify.js --out-dir src/mini --ignore src/mini src
# Справка по опциям
node minify.js --help
- Кэш хранится в
<out-dir>/.cache.json
и основан на времени модификации файла (mtime) + активных опциях. - При неизменённом файле и тех же опциях файл пропускается (отмечается как «(кэш)» в логе).
- Изменение опций обнуляет кэш автоматически.
- Лицензии: при флаге
--keep-licenses
сохраняются комментарии вида/*! ... */
. - Source maps: при
--sourcemap
карта сохраняется рядом с*.min.*
и добавляется ссылка//# sourceMappingURL
в конец минифицированного файла. - Структура вывода: повторяет исходную структуру относительно
process.cwd()
. - ESM: проект использует ESM ("type": "module").
- Код завершения: при
--fail-on-error
процесс завершится с кодом 1, если в каких-либо файлах произошли ошибки минификации. - Баннер:
--banner-file
имеет приоритет над--banner
. Если баннер задан, он добавляется в начало минифицированного файла. - Безопасность: входные пути проверяются на выход за пределы проекта.
- Большие файлы: файлы свыше 50MB пропускаются с предупреждением.
- Диагностика: синтаксические ошибки выделяются отдельно от других ошибок минификации.
- Важно: если задаёте
--out-dir
внутри входной папки, добавьте этот каталог в--ignore
, чтобы исключить повторный обход уже сгенерированных файлов.
MIT. См. файл LICENSE.