## Роль `next.config.js` при использовании SWC
В проектах на Next.js компилятор SWC используется по умолчанию для трансиляции JavaScript и TypeScript, обработки JSX, оптимизации производительности сборки, минификации и выполнения ряда преобразований, которые ранее выполнялись Babel. Основная точка настройки поведения SWC в экосистеме Next.js — файл `next.config.js`.
Через данный файл можно управлять трансформациями кода, включать экспериментальные возможности, настраивать минификацию, работу с пакетами, поддержку отдельных языковых возможностей и интеграцию с внешними библиотеками.
Стандартная структура конфигурации выглядит следующим образом:
```javascript
/** @type {import('next').NextConfig} */
const nextConfig = {
}
module.exports = nextConfig
```
Все параметры, связанные с использованием SWC, добавляются внутрь объекта конфигурации.
---
## Включение SWC Minify
Одной из наиболее популярных возможностей SWC является высокопроизводительная минификация JavaScript-кода.
Ранее Next.js использовал Terser, однако SWC позволяет выполнять аналогичную работу значительно быстрее благодаря реализации на Rust.
Конфигурация:
```javascript
const nextConfig = {
swcMinify: true
}
module.exports = nextConfig
```
После включения:
* уменьшается размер итоговых бандлов;
* ускоряется процесс production-сборки;
* сокращается время CI/CD-пайплайнов;
* уменьшается нагрузка на процессор во время компиляции.
При выполнении команды:
```bash
next build
```
минификация будет выполняться средствами SWC.
---
## Настройка React Strict Mode
Хотя данный параметр напрямую не относится к трансформациям SWC, он влияет на итоговый процесс компиляции React-приложения.
```javascript
const nextConfig = {
reactStrictMode: true
}
module.exports = nextConfig
```
В режиме разработки React выполняет дополнительные проверки компонентов.
Поскольку SWC участвует в обработке JSX и React-кода, данная настройка часто используется совместно с его конфигурацией.
---
## Использование Compiler API
Next.js предоставляет секцию `compiler`, через которую осуществляется управление отдельными возможностями SWC.
Структура:
```javascript
const nextConfig = {
compiler: {
}
}
module.exports = nextConfig
```
Именно этот раздел является основным местом конфигурирования компилятора.
---
## Удаление `console` в production
SWC способен автоматически удалять вызовы консольных методов во время сборки.
Конфигурация:
```javascript
const nextConfig = {
compiler: {
removeConsole: true
}
}
module.exports = nextConfig
```
Пример исходного кода:
```javascript
console.log('Debug')
console.info('Information')
export default function Home() {
return
Hello
}
```
После production-сборки:
```javascript
export default function Home() {
return React.createElement("div", null, "Hello")
}
```
Все инструкции логирования будут удалены.
---
### Исключение отдельных методов
Иногда требуется сохранить некоторые виды логирования.
```javascript
const nextConfig = {
compiler: {
removeConsole: {
exclude: ['error']
}
}
}
```
Тогда:
```javascript
console.log('Message')
console.error('Error')
```
превратится в:
```javascript
console.error('Error')
```
Метод `error` останется в коде.
---
## Поддержка Styled Components
SWC содержит встроенный трансформер для библиотеки Styled Components.
Ранее для этого использовался Babel-плагин:
```json
{
"plugins": ["styled-components"]
}
```
Теперь достаточно указать:
```javascript
const nextConfig = {
compiler: {
styledComponents: true
}
}
module.exports = nextConfig
```
После активации становятся доступны:
* корректные displayName;
* серверный рендеринг;
* оптимизация классов;
* улучшенная отладка.
---
### Расширенная конфигурация Styled Components
```javascript
const nextConfig = {
compiler: {
styledComponents: {
displayName: true,
ssr: true,
fileName: true,
minify: true,
transpileTemplateLiterals: true,
pure: true
}
}
}
```
Описание параметров:
| Параметр | Назначение |
| ------------------------- | ------------------------------------------------ |
| displayName | отображение имен компонентов |
| ssr | поддержка серверного рендера |
| fileName | добавление имени файла |
| minify | минификация CSS |
| transpileTemplateLiterals | оптимизация шаблонных строк |
| pure | генерация специальных аннотаций для tree-shaking |
---
## Поддержка Emotion
SWC содержит встроенную поддержку Emotion.
Включение:
```javascript
const nextConfig = {
compiler: {
emotion: true
}
}
module.exports = nextConfig
```
Либо расширенный вариант:
```javascript
const nextConfig = {
compiler: {
emotion: {
sourceMap: true,
autoLabel: 'always',
labelFormat: '[local]'
}
}
}
}
```
Параметры позволяют управлять:
* генерацией source maps;
* автоматическим именованием классов;
* форматом меток компонентов.
---
## Оптимизация импорта библиотек
Одной из мощных возможностей SWC является автоматическая трансформация импортов.
Рассмотрим библиотеку:
```javascript
import { Button } from 'ui-library'
```
Без оптимизации может подключаться весь пакет.
Использование `modularizeImports`:
```javascript
const nextConfig = {
modularizeImports: {
'ui-library': {
transform: 'ui-library/dist/{{member}}'
}
}
}
```
SWC автоматически преобразует:
```javascript
import { Button } from 'ui-library'
```
в:
```javascript
import Button from 'ui-library/dist/Button'
```
Это существенно уменьшает размер итогового бандла.
---
## Использование `optimizePackageImports`
В современных версиях Next.js появился механизм автоматической оптимизации популярных библиотек.
Конфигурация:
```javascript
const nextConfig = {
experimental: {
optimizePackageImports: [
'lodash-es',
'date-fns',
'ramda'
]
}
}
```
SWC выполняет преобразование импортов автоматически.
Преимущества:
* снижение размера bundle;
* уменьшение количества модулей;
* ускорение запуска приложения.
---
## Транспиляция внешних пакетов
Некоторые npm-пакеты публикуются в современном синтаксисе JavaScript и требуют дополнительной обработки.
Для этого используется:
```javascript
const nextConfig = {
transpilePackages: [
'shared-ui',
'common-utils'
]
}
```
Теперь SWC будет компилировать данные пакеты так же, как локальный исходный код проекта.
Особенно полезно при использовании:
* monorepo;
* Turborepo;
* внутренних корпоративных библиотек;
* workspace-пакетов.
---
## Поддержка Relay
SWC содержит встроенную интеграцию с Relay.
Настройка:
```javascript
const nextConfig = {
compiler: {
relay: {
src: './src'
}
}
}
```
Возможности:
* анализ GraphQL-запросов;
* оптимизация Relay-компонентов;
* генерация необходимого промежуточного кода.
---
## Настройка React Properties
Для улучшения отладки React-приложений можно сохранять дополнительные метаданные.
```javascript
const nextConfig = {
compiler: {
reactRemoveProperties: true
}
}
```
SWC удаляет специальные свойства вида:
```html
```
После сборки:
```html
```
---
### Удаление только определённых свойств
```javascript
const nextConfig = {
compiler: {
reactRemoveProperties: {
properties: [
'^data-testid$',
'^data-test$'
]
}
}
}
}
```
Используются регулярные выражения.
---
## Удаление PropTypes
В крупных React-проектах часто применяется библиотека PropTypes.
Во время production-сборки её можно исключать из итогового бандла.
```javascript
const nextConfig = {
compiler: {
removeReactProperties: true
}
}
```
Либо использовать специализированные плагины экосистемы для более агрессивного удаления проверок.
Такой подход позволяет сократить объём клиентского JavaScript.
---
## Экспериментальные возможности SWC
Многие новые функции Next.js сначала появляются внутри раздела `experimental`.
Пример:
```javascript
const nextConfig = {
experimental: {
}
}
```
Содержимое этого раздела зависит от версии Next.js.
Наиболее часто здесь располагаются:
* новые трансформации SWC;
* экспериментальные оптимизации;
* механизмы tree-shaking;
* улучшения Server Components;
* новые алгоритмы компиляции.
Перед использованием рекомендуется проверять совместимость с конкретной версией Next.js.
---
## Настройка внешних пакетов для Server Components
SWC участвует в анализе зависимостей серверных компонентов.
Пример:
```javascript
const nextConfig = {
experimental: {
serverComponentsExternalPackages: [
'sharp',
'bcrypt'
]
}
}
```
Это позволяет корректно работать с пакетами, использующими возможности Node.js.
---
## Комбинирование нескольких настроек
Реальная конфигурация обычно объединяет несколько возможностей SWC одновременно.
Пример:
```javascript
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
transpilePackages: [
'@company/ui',
'@company/shared'
],
compiler: {
removeConsole: {
exclude: ['error']
},
styledComponents: {
displayName: true,
ssr: true,
minify: true
},
reactRemoveProperties: {
properties: ['^data-testid$']
}
},
experimental: {
optimizePackageImports: [
'lodash-es',
'date-fns'
]
}
}
module.exports = nextConfig
```
Такая конфигурация одновременно обеспечивает:
* быстрые сборки благодаря SWC;
* минификацию кода;
* оптимизацию импортов;
* уменьшение размера бандлов;
* поддержку Styled Components;
* удаление отладочных конструкций;
* транспиляцию внешних пакетов;
* улучшение производительности production-версии приложения.
## Порядок применения трансформаций
Во время сборки Next.js использует SWC как центральный компилятор. Упрощённая последовательность обработки выглядит следующим образом:
1. Чтение исходного кода.
2. Разбор в AST (Abstract Syntax Tree).
3. Выполнение трансформаций SWC.
4. Применение настроек из секции `compiler`.
5. Оптимизация импортов.
6. Транспиляция JSX и TypeScript.
7. Минификация.
8. Генерация итоговых бандлов.
Схематично процесс можно представить так:
```text
Source Code
↓
AST Parsing
↓
SWC Transform
↓
Compiler Options
↓
Bundle Optimization
↓
Minification
↓
Production Output
```
Благодаря тому, что все перечисленные операции выполняются внутри высокопроизводительного компилятора на Rust, Next.js получает значительное ускорение сборки по сравнению с классической цепочкой Babel + Terser.