Skip to main content

Що таке "tree shaking"?

Що таке Tree Shaking

Tree shaking - це процес видалення "мертвого" (невикористовуваного) коду на етапі збірки JavaScript-застосунку.

Термін походить від метафори:

"струсити дерево коду і скинути мертве листя"

Тобто збирач аналізує залежності і залишає лише ті функції, класи і змінні, які справді використовуються.

Приклад до і після

math.js

javascript
export function add(a, b) { return a + b; } export function multiply(a, b) { return a * b; } export function subtract(a, b) { return a - b; }

app.js

javascript
import { add } from './math.js'; console.log(add(2, 3));

Після tree shaking у фінальному бандлі залишиться лише функція add, а multiply і subtract - видаляться, як "невикористовувані".

Як це працює

Tree shaking працює лише з модулями ES6 (ESM), тобто з import / export, а не з require().

Причина: ESM має статичний аналіз залежностей, тобто збирач заздалегідь знає, які модулі і функції використовуються, на відміну від динамічного require() у CommonJS.

Приклад статичного аналізу

javascript
import { add } from './math.js';

Збирач точно знає: з math.js потрібна лише add. Решту експортованих функцій можна безпечно видалити.

Якщо використовувати CommonJS (require)

javascript
const math = require('./math.js'); console.log(math.add(2, 3));

Тут math - об'єкт, який може змінюватись під час виконання, тому збирач не може безпечно видалити multiply або subtract.

Tree shaking не спрацює.

Що допомагає Tree Shaking працювати

УмоваЧому важливо
Використовувати import / exportЛише вони дозволяють статичний аналіз
Збирач з підтримкою tree shakingWebpack, Rollup, Vite, esbuild та ін.
Мінифікація (Terser / SWC / esbuild)Видаляє "мертві" функції і змінні
Вказувати "sideEffects": false у package.jsonПовідомляє збирачу, що імпорт не викликає побічних ефектів

Приклад package.json

javascript
{ "name": "my-lib", "sideEffects": false }

Це означає, що імпорт будь-якого файлу з пакета безпечний для видалення, якщо результат не використовується.

"sideEffects" - важливий момент

Іноді імпорт виконує код "заради ефекту", наприклад:

javascript
import './polyfill.js'; // виконує код, але нічого не експортує

У цьому випадку потрібно вказати:

javascript
{ "sideEffects": ["./polyfill.js"] }

щоб збирач не видалив його помилково.

Де використовується Tree Shaking

ІнструментПідтримка
WebpackТак, з mode: "production"
RollupТак (спочатку був створений саме для цього)
ViteТак (на базі Rollup)
esbuild / SWCТак, вбудовано

Приклад з Webpack

javascript
// webpack.config.js module.exports = { mode: 'production', // вмикає tree shaking optimization: { usedExports: true } };

Як перевірити, чи працює tree shaking

  1. Запусти збірку (npm run build)
  2. Відкрий згенерований JS-файл
  3. Перевір, чи залишились невикористовувані функції (або використай webpack-bundle-analyzer)

Підсумок

ПараметрОпис
Що робитьВидаляє невикористовуваний код зі збірки
Коли працюєПри використанні import/export і production-режиму
МетаЗменшити розмір бандла і прискорити завантаження
Головна умоваКод повинен бути "side-effect free"

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.