Tree shaking
Tree shaking (англ. Tree shaking, укр. трусити дерево) — це термін в обчислювальній техніці, що позначає метод видалення мертвого коду при оптимізації програмного забезпечення.[1]
Цей підхід часто протиставляють традиційним методам видалення невикористовуваного коду, які застосовуються у звичайних мініфікаторах та працюють у межах окремих бібліотек. Натомість алгоритм трішейкінгу аналізує весь пакунок (бандл) цілком: починаючи з точки входу, він включає до фінальної збірки лише ті функції, які дійсно можуть бути виконані.[2][3] Лаконічно цей процес описують терміном «включення живого коду» (англ. live code inclusion).
Видалення мертвого коду в динамічних мовах програмування є значно складнішим завданням, аніж у статичних. Сама концепція «трішейкера» зародилася ще в 1990-х роках у середовищі мови LISP[4]. Ідея полягає в тому, що всі можливі потоки виконання програми можна представити у вигляді дерева викликів функцій; відтак, функції, які ніколи не викликаються, можна видалити.
У JavaScript цей алгоритм вперше застосували в наборі інструментів Google Closure Tools, а згодом — у компіляторі dart2js для мови Dart, який також розробила компанія Google. Цю тему піднімав Боб Найстром у 2012 році[5][3], а детальний опис з'явився у книзі «Dart in Action» (2013) автора Кріса Бакета:
| Коли код конвертується з Dart у JavaScript, компілятор виконує «трішейкінг». У звичайному JavaScript вам доводиться підключати бібліотеку цілком, навіть якщо потрібна лише одна функція. Натомість, завдяки трішейкінгу, JavaScript-код, згенерований з Dart, містить лише ті окремі функції бібліотеки, які вам дійсно необхідні. | ||
— Кріс Бакет | ||
Наступна хвиля популярності цього терміна пов'язана з проєктом Rollup, який Річ Гарріс розробив у 2015 році[6].
Поширення трішейкінгу в сучасному JavaScript значною мірою зумовлене особливостями модулів ECMAScript 6 (ES6). На відміну від модулів CommonJS, структура яких є динамічною, завантаження модулів в ES6 відбувається статично. Це дозволяє визначити повне дерево залежностей шляхом статичного аналізу синтаксичного дерева, що робить задачу трішейкінгу відносно простою.
Втім, трішейкінг не обов'язково обмежується лише рівнем імпорту чи експорту модулів; залежно від конкретної реалізації, оптимізація може відбуватися і на рівні окремих інструкцій.[джерело?]
- ↑ Reduce JavaScript Payloads with Tree Shaking.
- ↑ Harris, Rich (15 січня 2019). Tree-shaking versus dead code elimination. Процитовано 16 вересня 2020.
- ↑ а б Ladd, Seth (29 січня 2013). Minification is not enough, you need tree shaking. Seth Ladd's Blog.
- ↑ comp.lang.lisp What's a treeshaker?
- ↑ Can Google Dart Solve JavaScript's Speed and Scale Problems?
- ↑ How To Clean Up Your JavaScript Build With Tree Shaking