swc-loader — загрузчик для Webpack, использующий
компилятор SWC вместо Babel. SWC написан на языке Rust и ориентирован на
максимально быструю трансформацию JavaScript и TypeScript-кода. Основная
задача загрузчика — транспиляция современного синтаксиса в код,
совместимый с целевыми браузерами или средами выполнения.
SWC особенно востребован в крупных проектах, где время сборки становится критичным фактором. В отличие от Babel, выполняющего преобразования через JavaScript-плагины, SWC использует нативный высокопроизводительный движок.
Основные области применения:
babel-loader в React-проектах;Минимальная установка включает Webpack, SWC и загрузчик:
npm install webpack webpack-cli swc-loader @swc/core --save-dev
Для React-проектов дополнительно может использоваться:
npm install react react-dom
swc-loaderПростейшая конфигурация Webpack:
const path = require('path');
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'swc-loader'
}
}
]
}
};
В таком виде SWC уже способен транспилировать современный JavaScript.
optionsБольшинство параметров задаются внутри jsc.
Пример:
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'swc-loader',
options: {
jsc: {
target: 'es2018'
}
}
}
}
targettarget определяет уровень итогового JavaScript-кода.
Пример:
options: {
jsc: {
target: 'es5'
}
}
Поддерживаемые варианты:
es3es5es2015es2016es2017es2018es2019es2020es2021es2022Чем ниже target, тем больше преобразований выполняется.
SWC способен компилировать TypeScript без участия
ts-loader.
Настройка:
{
test: /\.ts$/,
exclude: /node_modules/,
use: {
loader: 'swc-loader',
options: {
jsc: {
parser: {
syntax: 'typescript'
}
}
}
}
}
Для React + TypeScript:
{
test: /\.tsx$/,
exclude: /node_modules/,
use: {
loader: 'swc-loader',
options: {
jsc: {
parser: {
syntax: 'typescript',
tsx: true
}
}
}
}
}
SWC поддерживает JSX без Babel.
Конфигурация:
{
test: /\.jsx$/,
exclude: /node_modules/,
use: {
loader: 'swc-loader',
options: {
jsc: {
parser: {
syntax: 'ecmascript',
jsx: true
}
}
}
}
}
Современный React использует automatic runtime.
Настройка:
options: {
jsc: {
parser: {
syntax: 'ecmascript',
jsx: true
},
transform: {
react: {
runtime: 'automatic'
}
}
}
}
Старый режим React:
transform: {
react: {
runtime: 'classic'
}
}
В этом режиме требуется импорт React:
import React from 'react';
SWC умеет автоматически добавлять development-возможности:
transform: {
react: {
development: true,
refresh: true
}
}
Поддерживаются:
SWC поддерживает decorators.
Пример:
options: {
jsc: {
parser: {
syntax: 'typescript',
decorators: true
},
transform: {
decoratorMetadata: true
}
}
}
SWC поддерживает:
import('./module.js');
Webpack автоматически создает отдельные чанки.
Современные поля классов:
class User {
name = 'Alex';
}
Настройка:
parser: {
syntax: 'ecmascript',
classProperty: true
}
Приватные поля:
class User {
#token = '123';
}
SWC способен транспилировать такой синтаксис для старых браузеров.
Современный синтаксис:
user?.profile?.email
SWC преобразует его для старых окружений.
Поддерживается:
const value = data ?? 'default';
SWC может заменять Terser.
Пример:
optimization: {
minimize: true,
minimizer: []
}
С использованием плагина:
npm install swc-minify-webpack-plugin --save-dev
Конфигурация:
const SwcMinifyWebpackPlugin = require('swc-minify-webpack-plugin');
optimization: {
minimize: true,
minimizer: [
new SwcMinifyWebpackPlugin()
]
}
Настройка source maps:
devtool: 'source-map'
SWC корректно генерирует карты исходников.
.swcrcКонфигурацию можно вынести:
{
"jsc": {
"target": "es2018",
"parser": {
"syntax": "ecmascript",
"jsx": true
}
}
}
Webpack-конфигурация упрощается:
{
loader: 'swc-loader'
}
Главное преимущество SWC — производительность.
На крупных проектах ускорение может достигать:
Особенно заметна разница:
Несмотря на высокую скорость, экосистема SWC существенно меньше Babel.
Некоторые Babel-плагины:
Это особенно важно в проектах с нестандартными трансформациями.
Babel обладает зрелой системой AST-плагинов.
SWC пока уступает в:
Сложные Babel-конвейеры часто невозможно перенести напрямую.
SWC компилирует TypeScript, но не выполняет полноценную проверку типов.
То есть:
swc-loader !== tsc
Для type checking обычно используется:
tsc --noEmit
или:
fork-ts-checker-webpack-plugin
Некоторые преобразования работают иначе.
Возможны различия:
При миграции крупных проектов это требует тестирования.
Возможна гибридная схема:
use: [
{
loader: 'babel-loader'
},
{
loader: 'swc-loader'
}
]
Однако подобная комбинация редко оправдана, так как:
SWC поддерживает Jest через:
npm install @swc/jest --save-dev
Пример:
module.exports = {
transform: {
'^.+\\.(t|j)sx?$': '@swc/jest'
}
};
Современный Next.js по умолчанию использует SWC вместо Babel.
SWC отвечает за:
NestJS также поддерживает SWC для ускорения компиляции backend-приложений.
SWC особенно эффективен в:
Причины:
В development-среде SWC заметно сокращает:
Это особенно заметно в React-проектах с большим количеством компонентов.
Webpack cache отлично сочетается с SWC:
cache: {
type: 'filesystem'
}
Вместе это дает существенное ускорение повторных сборок.
swc-loader и esbuild-loaderПреимущества:
Недостатки:
Преимущества:
Недостатки:
swc-loader особенно эффективенНаиболее удачные сценарии:
Проблемные сценарии:
const path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.tsx',
output: {
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist'),
clean: true
},
resolve: {
extensions: ['.tsx', '.ts', '.js']
},
module: {
rules: [
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
use: {
loader: 'swc-loader',
options: {
jsc: {
target: 'es2018',
parser: {
syntax: 'typescript',
tsx: true
},
transform: {
react: {
runtime: 'automatic'
}
}
}
}
}
}
]
},
cache: {
type: 'filesystem'
}
};