Tree shaking

Tree shaking — это механизм оптимизации, позволяющий удалять из итогового бандла неиспользуемый код. В контексте библиотеки Ant Design (Antd) это особенно важно, так как библиотека включает множество компонентов, стилей и утилит, и без оптимизации итоговый размер приложения может вырасти значительно.


Основные принципы Tree Shaking

  1. Модули ES6 Ant Design поддерживает импорт компонентов через ES-модули (import { Button } from 'antd'). Для корректной работы tree shaking необходимо использовать именно такой синтаксис. CommonJS-импорты (const Button = require('antd').Button) не позволяют сборщикам, таким как Webpack или Rollup, удалять неиспользуемый код.

  2. Отдельный импорт компонентов Для минимизации размера бандла следует импортировать только используемые компоненты:

    import { Button, DatePicker } from 'antd';

    Однако это может не полностью исключать все стили. По умолчанию, импорт стилей в Antd идет глобально, что приводит к включению всего CSS библиотеки.


Импорт стилей с использованием Babel

Для эффективного tree shaking стилей Ant Design рекомендует использовать плагин babel-plugin-import. Он позволяет автоматически подгружать только те стили, которые соответствуют импортированным компонентам.

Пример настройки .babelrc:

{
  "plugins": [
    ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]
  ]
}

Пояснения:

  • "libraryName": "antd" — указывает библиотеку.
  • "libraryDirectory": "es" — гарантирует использование ES-модулей.
  • "style": "css" — автоматически подгружает CSS конкретного компонента (Buttonbutton.css).

Для проектов с Less можно использовать:

{
  "plugins": [
    ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": true }]
  ]
}

В этом случае будет применяться возможность кастомизации переменных через Less.


Tree Shaking и Webpack

Webpack с включенным режимом production и sideEffects: false в package.json проекта позволяет максимально эффективно удалять неиспользуемый код.

Пример package.json:

{
  "name": "my-app",
  "version": "1.0.0",
  "sideEffects": false
}
  • sideEffects: false сообщает сборщику, что все модули не имеют побочных эффектов и могут быть безопасно удалены, если они не используются.
  • В случае с Ant Design можно также указывать стили как побочные эффекты, если они импортируются глобально:
"sideEffects": ["*.css", "*.less"]

Использование @ant-design/icons с tree shaking

Иконки в Ant Design поставляются отдельным пакетом @ant-design/icons, который поддерживает ES-модули. Для минимизации бандла:

import { SearchOutlined, UserOutlined } from '@ant-design/icons';

Импорт всех иконок через import * as Icons from '@ant-design/icons' приведет к включению всего набора, что значительно увеличивает размер бандла.


Ant Design 5 и оптимизация

Начиная с версии 5, Ant Design предоставляет более удобный подход к tree shaking:

  • Поддержка ES modules по умолчанию.
  • Оптимизированные стили через style={{}} и useStyleRegister.
  • Возможность динамического импорта компонентов с React.lazy:
const Button = React.lazy(() => import('antd/es/button'));

Это позволяет подгружать компонент только при его использовании, уменьшая первоначальный размер бандла.


Практические рекомендации

  1. Использовать ES-импорты компонентов вместо CommonJS.
  2. Подключать стили через babel-plugin-import или через Less с настройкой переменных.
  3. Не импортировать все иконки сразу, только необходимые.
  4. Включить production mode и sideEffects: false в package.json.
  5. Рассматривать React.lazy и динамический импорт для редко используемых компонентов.

Следование этим принципам позволяет минимизировать размер финального бандла и ускорить загрузку приложения, особенно при работе с крупными библиотеками UI, такими как Ant Design.