← Назад к вопросам

Как уменьшить размер bundle получаемого в Next.js?

2.3 Middle🔥 251 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стратегии оптимизации бандла в Next.js

Оптимизация размера бандла в Next.js — критически важная задача для улучшения производительности приложений. Вот комплексный подход к решению этой проблемы.

📦 Анализ и мониторинг бандла

Перед оптимизацией необходимо понять текущую ситуацию:

// package.json
{
  "scripts": {
    "analyze": "ANALYZE=true next build",
    "analyze:bundle": "npx @next/bundle-analyzer"
  }
}

Установите @next/bundle-analyzer и настройте next.config.js:

const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true'
})

module.exports = withBundleAnalyzer({
  reactStrictMode: true,
})

Запуск npm run analyze создаст интерактивную визуализацию бандла, показывающую:

  • Самые тяжелые зависимости
  • Дублирующийся код
  • Неоптимальные импорты

🔧 Основные техники оптимизации

1. Code Splitting и Dynamic Imports

Next.js автоматически сплитит код по страницам, но можно оптимизировать дальше:

// ❌ Плохо - весь модуль загружается сразу
import HeavyComponent from '../components/HeavyComponent'

// ✅ Оптимально - загрузка по требованию
const DynamicHeavyComponent = dynamic(
  () => import('../components/HeavyComponent'),
  {
    loading: () => <Loader />,
    ssr: false // если не нужен при SSR
  }
)

// ✅ Для библиотек
const Plotly = dynamic(() => import('plotly.js-dist-min'), { ssr: false })

2. Оптимизация зависимостей

Анализ package.json:

  • Используйте npm ls --depth=10 для обнаружения дубликатов
  • Переходите на более легкие альтернативы:
    • date-fns вместо moment.js
    • lodash-es с tree-shaking вместо полного lodash
    • react-icons с selective imports
// ❌ Загружает всю библиотеку
import _ from 'lodash'

// ✅ Загружает только нужную функцию
import debounce from 'lodash/debounce'

// ✅ Еще лучше для ES модулей
import { debounce } from 'lodash-es'

3. Конфигурация Next.js

// next.config.js
module.exports = {
  compiler: {
    removeConsole: process.env.NODE_ENV === 'production',
  },
  experimental: {
    optimizeCss: true, // оптимизация CSS
    scrollRestoration: true,
  },
  
  // Оптимизация изображений
  images: {
    formats: ['image/avif', 'image/webp'],
    minimumCacheTTL: 60,
  },
}

🚀 Продвинутые техники

1. Tree Shaking и Side Effects

Убедитесь, что в package.json библиотек правильно указаны sideEffects:

{
  "sideEffects": false,
  "module": "esm/index.js",
  "main": "cjs/index.js"
}

2. Оптимизация шрифтов

// Используйте next/font вместо CSS @import
import { Inter } from 'next/font/google'

const inter = Inter({ subsets: ['latin'] })

export default function Component() {
  return <p className={inter.className}>Текст</p>
}

3. Компонентная архитектура

// Создайте lightweight компоненты
const SmallComponent = React.memo(({ data }) => {
  // Логика компонента
})

// Разделяйте логику
const useHeavyLogic = () => {
  // Тяжелая логика
}

// Легкий презентационный компонент
const LightComponent = ({ data }) => {
  const result = useHeavyLogic(data)
  return <div>{result}</div>
}

📊 Практические примеры оптимизации

Сценарий 1: Большая библиотека UI компонентов

// ❌ Импорт всей библиотеки
import { Button, Modal, Table, Form, ... } from 'heavy-ui-library'

// ✅ Импорт только необходимого
import Button from 'heavy-ui-library/Button'
import Modal from 'heavy-ui-library/Modal'

// ✅ Использование dynamic imports для редких компонентов
const HeavyTable = dynamic(() => import('heavy-ui-library/Table'))

Сценарий 2: Медиа файлы

// Используйте next/image для автоматической оптимизации
import Image from 'next/image'

<Image
  src="/large-image.jpg"
  alt="Описание"
  width={500}
  height={300}
  priority={false} // lazy loading по умолчанию
/>

📈 Мониторинг результатов

Метрики для отслеживания:

  • First Load JS (в Next.js аналитике)
  • Largest Contentful Paint (LCP)
  • Total Bundle Size
  • Number of Requests

Инструменты:

  • Lighthouse в Chrome DevTools
  • WebPageTest
  • Next.js Analytics
  • Custom metrics с web-vitals

🛠️ Дополнительные рекомендации

  1. Регулярно обновляйте зависимости — новые версии часто содержат оптимизации
  2. Настройте CDN для статических ресурсов
  3. Используйте compression (compression middleware)
  4. Внедрите caching стратегии для статических ресурсов
  5. Рассмотрите Edge Functions для логики, не требующей полного бандла

🔄 Непрерывная оптимизация

Оптимизация бандла — не разовое мероприятие, а постоянный процесс. Внедрите в CI/CD пайплайн:

# .github/workflows/bundle-check.yml
- name: Analyze Bundle
  run: npm run analyze
- name: Check Bundle Size
  uses: actions/setup-node@v3

Регулярно проверяйте:

  • Новые зависимости в pull requests
  • Размер бандла после каждого major обновления
  • Производительность в production с помощью RUM (Real User Monitoring)

Эти стратегии в комплексе позволяют снизить размер бандла на 40-70%, что значительно улучшает пользовательский опыт, особенно на мобильных устройствах и медленных сетях. Ключевой принцип: загружайте только то, что нужно, когда это нужно.

Как уменьшить размер bundle получаемого в Next.js? | PrepBro