Что такое Tree shaking

Ответ

Tree shaking — это процесс устранения неиспользуемого кода (dead code) из финального бандла при сборке проекта. Он работает на этапе компиляции, анализируя зависимости между модулями через статический анализ (ES6 import/export).

Как работает:

  1. Сборщик (Webpack, Rollup) определяет, какие экспорты реально используются.
  2. Неиспользуемые модули/функции исключаются из бандла.

Условия для работы:

  • Использование ES-модулей (import/export).
  • Отсутствие side effects в модулях (можно пометить в package.json: "sideEffects": false).

Пример:

// math.js
export const add = (a, b) => a + b;
export const unused = () => console.log('Это удалится!');

// main.js
import { add } from './math.js';
console.log(add(2, 3)); // unused не попадет в бандл

Важно: Tree shaking не удалит код, импортированный через require (CommonJS) или динамические импорты.

Ответ 18+ 🔞

А, ну это ж про то, как от проекта отпиливать всё лишнее, чтобы он не весил как чугунный мост! Tree shaking, блядь, называется. Слушай, представь: ты пишешь проект, там дохуя библиотек, а используешь ты из них процентов десять, не больше. И вот эта самая штука — она как хирург-максималист, который режет без наркоза. Берёт и выкидывает нахуй весь мёртвый код, который нигде не вызывается.

Как оно бахает:

  1. Сборщик, будь то Webpack или Rollup, начинает умничать. Он смотрит на все твои import и export и строит граф зависимостей, как конспиролог на стероидах.
  2. Всё, что висит без дела — функции, переменные, целые модули — идёт на выброс. Пиздец, как будто их и не было.

Но есть нюансы, ёпта! Чтобы эта магия работала, нужно:

  • Писать на ES-модулях. Эти твои import { add } from './math' — самое то. А вот если ты старый пердун и юзаешь require, то можешь забыть. Ни хуя не вытрясется.
  • В package.json библиотеки должно быть прописано "sideEffects": false. Это такая бумажка «я, нижеподписавшийся, клянусь, что мой модуль не делает хуйни вроде автоматической регистрации глобальных полифилов при импорте». Если side effects есть — сборщик побоится это удалять, а то мало ли что сломается.

Смотри, наглядный пиздец:

// math.js
export const add = (a, b) => a + b;
export const unused = () => console.log('Это удалится, нахуй оно не сдалось!');

// main.js
import { add } from './math.js';
console.log(add(2, 3)); // А про unused все забудут, как про вчерашний день

В итоге в бандле будет только функция add. А unused отправится в цифровое небытие, ебать её в сраку. Чистая экономия, ядрёна вошь!

И главное запомни: если ты импортируешь что-то через require или динамически (import('module')), то тут tree shaking бессилен. Он же статический анализ делает, а не ясновидящий, блядь. Всё, что определяется в рантайме, для него — тёмный лес. Так что держи ухо востро, а код — в чистоте.