Tree shaking (, укр. трусити дерево) — це термін в обчислювальній техніці, що позначає метод видалення мертвого коду при оптимізації програмного забезпечення.
Цей підхід часто протиставляють традиційним методам видалення невикористовуваного коду, які застосовуються у звичайних мініфікаторах та працюють у межах окремих бібліотек. Натомість алгоритм трішейкінгу аналізує весь пакунок (бандл) цілком: починаючи з точки входу, він включає до фінальної збірки лише ті функції, які дійсно можуть бути виконані. Лаконічно цей процес описують терміном «включення живого коду» ().
Історія Видалення мертвого коду в динамічних мовах програмування є значно складнішим завданням, аніж у статичних. Сама концепція «трішейкера» зародилася ще в 1990-х роках у середовищі мови LISPcomp.lang.lisp What's a treeshaker?. Ідея полягає в тому, що всі можливі потоки виконання програми можна представити у вигляді дерева викликів функцій; відтак, функції, які ніколи не викликаються, можна видалити.
У JavaScript цей алгоритм вперше застосували в наборі інструментів Google Closure Tools, а згодом — у компіляторі dart2js для мови Dart, який також розробила компанія Google. Цю тему піднімав Боб Найстром у 2012 роціCan Google Dart Solve JavaScript's Speed and Scale Problems?, а детальний опис з'явився у книзі «Dart in Action» (2013) автора Кріса Бакета:
Наступна хвиля популярності цього терміна пов'язана з проєктом Rollup, який Річ Гарріс розробив у 2015 роціHow To Clean Up Your JavaScript Build With Tree Shaking.
Зв'язок із модулями ECMAScript 6 Поширення трішейкінгу в сучасному JavaScript значною мірою зумовлене особливостями модулів ECMAScript 6 (ES6). На відміну від модулів CommonJS, структура яких є динамічною, завантаження модулів в ES6 відбувається статично. Це дозволяє визначити повне дерево залежностей шляхом статичного аналізу синтаксичного дерева, що робить задачу трішейкінгу відносно простою.
Втім, трішейкінг не обов'язково обмежується лише рівнем імпорту чи експорту модулів; залежно від конкретної реалізації, оптимізація може відбуватися і на рівні окремих інструкцій.
Примітки