Cloudflare, Mozilla och Facebook utvecklar BinaryAST för att påskynda JavaScript-laddningen

Ingenjörer från Cloudflare, Mozilla, Facebook och Bloomberg erbjöd nytt format binär AST för att påskynda leverans och bearbetning av JavaScript-kod när du öppnar webbplatser i en webbläsare. BinaryAST flyttar analysfasen till serversidan och tillhandahåller ett redan genererat abstrakt syntaxträd (AST). Efter att ha tagit emot en BinaryAST kan webbläsaren omedelbart gå vidare till kompileringsstadiet, utan att analysera JavaScript-källkoden.

För provning beredd referensimplementering som tillhandahålls under MIT-licensen. Node.js-komponenter används för att analysera, och koden för optimering och AST-generering är skriven i Rust. Stöd på webbläsaren
BinaryAST är redan tillgängligt i nattliga byggen Firefox. Kodaren i BinaryAST kan användas både på slutsidans verktygsnivå och för att paketera skript från externa webbplatser på sidan av ett proxy- eller innehållsleveransnätverk. För närvarande har arbetsgruppens standardisering av BinaryAST redan börjat ECMA TC39, varefter formatet kommer att kunna samexistera med befintliga innehållskomprimeringsmetoder, som gzip och brotli.

Cloudflare, Mozilla och Facebook utvecklar BinaryAST för att påskynda JavaScript-laddningen

Cloudflare, Mozilla och Facebook utvecklar BinaryAST för att påskynda JavaScript-laddningen

Vid bearbetning av JavaScript ägnas en betydande mängd tid åt att ladda och analysera koden. Med tanke på att volymen nedladdad JavaScript på många populära webbplatser är nära 10 MB (till exempel för LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), introducerar den initiala bearbetningen av JavaScript en betydande fördröjning. Parsningsstadiet på webbläsarsidan saktas också ner på grund av oförmågan att fullt ut bygga AST i farten när koden laddas (webbläsaren måste vänta på kodblock för att slutföra laddningen, såsom slutet av funktioner, för att få informationen som saknas för att analysera de aktuella elementen).

De försöker delvis lösa problemet genom att distribuera koden i en minimerad och komprimerad form, samt genom att cachelagra den genererade bytekoden av webbläsaren. På moderna sajter uppdateras koden ganska ofta, så cachning löser bara delvis problemet. WebAssembly skulle kunna vara en lösning, men det kräver explicit inskrivning av koden och är inte väl lämpad för att påskynda bearbetningen av befintlig JavaScript-kod.

Ett annat alternativ är att leverera färdig kompilerad bytekod istället för JavaScript-skript, men webbläsarmotorutvecklare är emot det eftersom tredjepartsbytekod är svår att verifiera, dess direkta bearbetning kan leda till webbstratifiering, ytterligare säkerhetsrisker uppstår och utveckling av ett universellt bytekodformat krävs.

BinaryAST låter dig passa in i din nuvarande kodutvecklings- och leveransmodell utan att skapa ny bytekod eller ändra JavaScript-språket. Storleken på data i BinaryAST-formatet är jämförbar med komprimerad minifierad JavaScript-kod, och bearbetningshastigheten genom att eliminera källtextanalysfasen ökar märkbart. Dessutom tillåter formatet kompilering till bytekod när BinaryAST laddas, utan att vänta på att all data ska slutföras. Dessutom tillåter parsning på serversidan att du utesluter oanvända funktioner och onödig kod från den returnerade BinaryAST-representationen, vilket, vid parsning på webbläsarsidan, slösar tid på både att analysera och överföra onödig trafik.

En funktion hos BinaryAST är också möjligheten att återställa läsbart JavaScript som inte är exakt samma som originalversionen, men är semantiskt likvärdigt och innehåller samma namn på variabler och funktioner (BinaryAST sparar namn, men sparar inte information om positioner i kod, formatering och kommentarer). Den andra sidan av myntet är uppkomsten av nya attackvektorer, men enligt utvecklarna är de mycket mindre och mer kontrollerbara än när man använder alternativ, som bytekoddistribution.

Tester av facebook.com-koden visade att analys av JavaScript förbrukar 10-15 % av CPU-resurserna och att analysera tar mer tid än att generera bytekod och initial kodgenerering för JIT. I SpiderMonkey-motorn tar tiden att helt bygga en AST 500-800 ms, och användningen av BinaryAST har minskat denna siffra med 70-90%.
I allmänhet, för de flesta webbfyrverkerier, när du använder BinaryAST, minskas JavaScript-parsningstiden med 3-10 % i läget utan optimering och med 90-97 % när läget för att ignorera oanvända funktioner är aktiverat.
När du körde en 1.2 MB JavaScript-testuppsättning tillät användningen av BinaryAST att starttiden ökade från 338 till 314 ms på ett stationärt system (Intel i7) och från 2019 till 1455 ms på en mobil enhet (HTC One M8).

Källa: opennet.ru

Lägg en kommentar