Минификация в SWC представляет собой этап преобразования JavaScript-кода, при котором исходный код уменьшается по размеру за счёт удаления пробелов, сокращения имён идентификаторов, упрощения выражений и применения наборов синтаксических оптимизаций. В отличие от транспиляции, где основная цель — изменение синтаксиса под целевую среду, минификация ориентирована исключительно на уменьшение итогового веса кода и ускорение загрузки в браузере.
SWC реализует минификацию как отдельный процесс, который может быть
подключён в различных режимах: через CLI, программный API,
конфигурационный файл .swcrc, а также через интеграции с
сборщиками.
Самый прямой способ активировать минификацию — использование CLI SWC с
флагом –minify.
swc src -d dist --minify
При таком запуске выполняется:
jsc в
конфигурации),
Дополнительно можно управлять поведением минификатора через параметры CLI:
swc src -d dist --minify --source-maps
Генерация source maps часто используется в связке с минификацией для сохранения возможности отладки.
При использовании SWC как библиотеки минификация включается через
функцию minify.
import { minify } from "@swc/core";
const inputCode = `
function add(a, b) {
return a + b;
}
`;
const result = await minify(inputCode, {
compress: true,
mangle: true,
module: true,
});
Параметры минификации:
Расширенный пример с сохранением читаемости для отладки:
const result = await minify(inputCode, {
compress: {
drop_console: true,
unused: true,
},
mangle: {
keep_fnames: false,
},
sourceMap: true,
});
Конфигурационный файл .swcrc позволяет централизованно
управлять процессом трансформации и минификации.
Простейшая активация:
{
"minify": true
}
В более детализированном виде конфигурация может включать параметры
compress и mangle:
{
"minify": true,
"jsc": {
"target": "es2020",
"parser": {
"syntax": "ecmascript"
}
},
"compress": {
"unused": true,
"dead_code": true,
"drop_console": true
},
"mangle": {
"keep_classnames": false,
"keep_fnames": false
}
}
Параметризация позволяет разделить уровни оптимизации:
jsc)
compress)
mangle)
В Webpack SWC часто используется как замена Terser через
swc-minify.
Установка:
npm install @swc/core swc-loader --save-dev
Конфигурация Webpack:
const swcMinify = require("@swc/core").minify;
module.exports = {
mode: "production",
optimization: {
minimize: true,
minimizer: [
new (require("swc-webpack-plugin"))({
minify: true,
jsc: {
target: "es2020",
},
}),
],
},
};
В более современных конфигурациях используется встроенная поддержка:
module.exports = {
optimization: {
minimize: true,
minimizer: [
new SwcMinifyPlugin({
compress: {
drop_console: true,
},
mangle: true,
}),
],
},
};
Next.js использует SWC как стандартный компилятор JavaScript и включает минификацию по умолчанию в production-режиме.
Включение или контроль поведения осуществляется через
next.config.js:
module.exports = {
swcMinify: true,
};
Параметр swcMinify управляет использованием SWC вместо
альтернативных минификаторов.
Поведение в production:
Блок compress определяет глубину оптимизации кода.
Ключевые параметры:
{
"compress": {
"unused": true
}
}
Удаляет:
{
"compress": {
"drop_console": true,
"drop_debugger": true
}
}
Применяется в production-сборках для очистки логов.
SWC упрощает выражения:
!!a → Boolean(a)
a + ““ → String(a)
0 || b → b
Это происходит автоматически при включённом compress.
Минификация имён — один из самых значимых факторов уменьшения размера bundle.
{
"mangle": true
}
Результат:
calculateTotalPrice → a
userData → b
Дополнительные параметры:
{
"mangle": {
"keep_fnames": true,
"keep_classnames": false
}
}
Сохранение имён функций может быть критично для:
SWC учитывает формат модулей при оптимизации.
ES Modules:
{
"module": true
}
CommonJS требует более осторожной оптимизации из-за динамического
характера require.
При включении module: true активируются дополнительные
возможности:
Минификация может быть настроена на нескольких уровнях строгости:
{
"minify": true
}
{
"compress": {
"unused": true,
"drop_console": true
},
"mangle": true
}
{
"compress": {
"dead_code": true,
"evaluate": true,
"collapse_vars": true,
"drop_console": true
},
"mangle": {
"toplevel": true
}
}
Агрессивная минификация может привести к:
Минификация без source maps существенно усложняет диагностику ошибок.
Пример включения:
await minify(code, {
sourceMap: true,
});
Или через CLI:
swc src -d dist --minify --source-maps
Source maps сохраняют связь между:
Причина:
{
"mangle": true
}
Решение:
{
"mangle": {
"keep_fnames": true
}
}
Причина:
compress.unused
Некоторые библиотеки зависят от:
Function.name
Корректировка:
{
"mangle": {
"keep_classnames": true,
"keep_fnames": true
}
}