Как безопасно минифицировать JavaScript
Сохраните читаемые исходники, создавайте production-файлы одной повторяемой командой и подключайте их с новой версией. После сборки обязательно проверяйте синтаксис и реальные действия на сайте.
Самый безопасный путь
Сообщение разработчику
«Настройте production-минификацию собственных JavaScript из исходников, не обрабатывайте повторно vendor *.min.js, сохраните обязательные лицензии, source maps по политике проекта и версионирование кеша. Зафиксируйте размеры до/после и проверьте сборку, Console, формы, меню и ключевые сценарии».
Сделайте резервную копию исходников, lock-файла, manifest и шаблонов подключения. Работайте в отдельной ветке или тестовой среде; не заменяйте production-файл без быстрого способа вернуть предыдущий артефакт.
Пошаговая настройка
- В Network соберите URL собственных JS и запишите Resource Size, Transferred, Content-Encoding и инициатор.
- Найдите исходный entry point и существующий сборщик: Vite, Webpack, Rollup, esbuild или другой поддерживаемый инструмент.
- Установите зависимости из lock-файла и сначала воспроизведите текущую development/production-сборку без изменений.
- Включите production mode и поддерживаемую минификацию. Не копируйте секреты из окружения в клиентский bundle.
- Настройте source map с учётом доступа: публичная карта может содержать исходный текст; приватная карта должна попадать в систему ошибок, но не в публичный каталог.
- Добавьте content hash или обновляемую версию в manifest/URL, подключите созданные файлы в шаблоне.
- Запустите синтаксическую проверку, тесты и контрольные сценарии; сравните ответы без кеша.
Пример отдельного файла с Terser
npx terser src/app.js \
--compress --mangle \
--source-map "filename='app.min.js.map',url='app.min.js.map'" \
--output public/js/app.min.jsЭто пример для простого классического файла, а не универсальная команда для любого проекта. Для модулей, нескольких entry points, JSX/TypeScript и динамических импортов используйте production-настройку существующего сборщика.
Не включайте опасные преобразования вслепую
Код с eval, динамическими именами, reflection, глобальными API плагинов или неверными side-effects может сломаться при агрессивном mangling/tree shaking. Меняйте настройку по одной и тестируйте.
Откат и отдельные работы
| Проверка | Хороший результат | При сбое |
|---|---|---|
| Build/Console | Нет ошибок и отсутствующих чанков | Вернуть предыдущий manifest и артефакты |
| Кеш | HTML ссылается на новый hash | Исправить публикацию и очистку |
| Функции | Сценарии проходят с первого раза | Отключить проблемное преобразование |
| Source map | Стек связан с исходником без утечки секретов | Изменить режим публикации карты |
Минификация не заменяет удаление неиспользуемого кода, code splitting, defer, Gzip/Brotli и исправление ошибок. После выпуска выполните независимую проверку.