Cloudflare, Mozilla и Facebook разработват BinaryAST, за да ускорят зареждането на JavaScript

Инженери от Cloudflare, Mozilla, Facebook и Bloomberg предлагана нов формат Двоичен AST за ускоряване на доставката и обработката на JavaScript код при отваряне на сайтове в браузъра. BinaryAST премества фазата на анализиране към страната на сървъра и предоставя вече генерирано абстрактно синтактично дърво (AST). След като получи BinaryAST, браузърът може незабавно да премине към етапа на компилация, заобикаляйки анализирането на изходния код на JavaScript.

За тестване подготвени референтна реализация, предоставена съгласно лиценза на MIT. Компонентите на Node.js се използват за анализиране, а кодът за оптимизиране и генериране на AST е написан на Rust. Поддръжка от страна на браузъра
BinaryAST вече е наличен в нощно сглобяване Firefox. Кодерът в BinaryAST може да се използва както на ниво инструменти на крайния сайт, така и за опаковане на скриптове на външни сайтове от страна на прокси или мрежа за доставка на съдържание. В момента процесът на стандартизация на BinaryAST от работната група вече е започнал ECMA TC39, след което форматът ще може да съществува съвместно със съществуващите методи за компресиране на съдържание, като gzip и brotli.

Cloudflare, Mozilla и Facebook разработват BinaryAST, за да ускорят зареждането на JavaScript

Cloudflare, Mozilla и Facebook разработват BinaryAST, за да ускорят зареждането на JavaScript

При обработката на JavaScript се изразходва значително време във фазата на зареждане и анализиране на кода. Като се има предвид, че обемът на изтегления JavaScript на много популярни сайтове е близо до 10 MB (например за LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), първоначалната обработка на JavaScript въвежда значително забавяне. Етапът на анализиране от страна на браузъра също се забавя поради невъзможността да се изгради напълно AST в движение, докато кодът се зарежда (браузърът трябва да изчака кодовите блокове да завършат зареждането, като например края на функциите, за да получи липсващата информация за анализиране на текущите елементи).

Те се опитват частично да решат проблема чрез разпространение на кода в минимизиран и компресиран вид, както и чрез кеширане на генерирания байткод от браузъра. На съвременните сайтове кодът се актуализира доста често, така че кеширането само частично решава проблема. WebAssembly може да бъде решение, но изисква изрично въвеждане в кода и не е много подходящ за ускоряване на обработката на съществуващ JavaScript код.

Друга възможност е да се достави готов компилиран байт код вместо скриптове на JavaScript, но разработчиците на браузъра са против, тъй като байт кодът на трети страни е труден за проверка, директната му обработка може да доведе до стратификация в мрежата, възникват допълнителни рискове за сигурността и развитието на изисква се универсален формат на байт код.

BinaryAST ви позволява да се вместите в текущия си модел за разработване и доставка на код, без да създавате нов байт код или да променяте езика на JavaScript. Размерът на данните във формата BinaryAST е сравним с компресирания минимизиран JavaScript код, а скоростта на обработка чрез елиминиране на фазата на анализ на изходния текст се увеличава значително. В допълнение, форматът позволява компилиране в байт код, докато BinaryAST се зарежда, без да се чака всички данни да завършат. Освен това парсването от страна на сървъра ви позволява да изключите неизползваните функции и ненужния код от върнатото представяне на BinaryAST, което, когато анализирате от страната на браузъра, губи време както за парсиране, така и за предаване на ненужен трафик.

Характеристика на BinaryAST е и възможността за възстановяване на четим JavaScript, който не е точно същият като оригиналната версия, но е семантично еквивалентен и включва същите имена на променливи и функции (BinaryAST запазва имена, но не запазва информация за позиции в код, форматиране и коментари). Другата страна на монетата е появата на нови вектори за атака, но според разработчиците те са много по-малки и по-контролируеми, отколкото при използване на алтернативи, като разпространение на байт код.

Тестовете на кода на facebook.com показаха, че парсването на JavaScript изразходва 10-15% от ресурсите на процесора и парсирането отнема повече време от генерирането на байт код и първоначалното генериране на код за JIT. В двигателя SpiderMonkey времето за пълно изграждане на AST отнема 500-800 ms, а използването на BinaryAST намали тази цифра със 70-90%.
Като цяло, за повечето уеб фойерверки, когато се използва BinaryAST, времето за анализ на JavaScript се намалява с 3-10% в режим без оптимизация и с 90-97%, когато е активиран режимът на игнориране на неизползваните функции.
При стартиране на тестов набор от 1.2 MB JavaScript, използването на BinaryAST позволи на времето за стартиране да се ускори от 338 на 314 ms на настолна система (Intel i7) и от 2019 до 1455 ms на мобилно устройство (HTC One M8).

Източник: opennet.ru

Добавяне на нов коментар