Cloudflare, Mozilla og Facebook udvikler BinaryAST for at fremskynde JavaScript-indlæsning

Ingeniører fra Cloudflare, Mozilla, Facebook og Bloomberg foreslået nyt format binær AST at fremskynde leveringen og behandlingen af ​​JavaScript-kode ved åbning af sider i browseren. BinaryAST flytter parsingsfasen til serversiden og leverer et allerede genereret abstrakt syntakstræ (AST). Efter at have modtaget en BinaryAST, kan browseren straks fortsætte til kompileringsstadiet og omgå parsing af JavaScript-kildekoden.

Til test forberedt referenceimplementering leveret under MIT-licensen. Node.js-komponenter bruges til parsing, og koden til optimering og AST-generering er skrevet i Rust. Browser-side support
BinaryAST er allerede tilgængelig i natsamling Firefox. Indkoderen i BinaryAST kan bruges både på slutstedets værktøjsniveau og til at pakke scripts fra eksterne websteder på siden af ​​et proxy- eller indholdsleveringsnetværk. I øjeblikket er processen med standardisering af BinaryAST af arbejdsgruppen allerede begyndt ECMA TC39, hvorefter formatet vil kunne eksistere side om side med eksisterende indholdskomprimeringsmetoder, såsom gzip og brotli.

Cloudflare, Mozilla og Facebook udvikler BinaryAST for at fremskynde JavaScript-indlæsning

Cloudflare, Mozilla og Facebook udvikler BinaryAST for at fremskynde JavaScript-indlæsning

Når JavaScript behandles, bruges en betydelig mængde tid i indlæsnings- og parsingsfasen af ​​koden. I betragtning af, at mængden af ​​downloadet JavaScript på mange populære websteder er tæt på 10 MB (for eksempel for LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), introducerer den indledende behandling af JavaScript en betydelig forsinkelse. Parsing-stadiet på browsersiden er også langsommere på grund af manglende evne til at bygge AST'en fuldt ud, mens koden indlæses (browseren skal vente på kodeblokke for at fuldføre indlæsningen, såsom afslutningen af ​​funktioner, for at opnå den information, der mangler for at parse de aktuelle elementer).

De forsøger delvist at løse problemet ved at distribuere koden i en minimeret og komprimeret form, samt ved at cache den genererede bytekode af browseren. På moderne websteder opdateres koden ret ofte, så caching løser kun delvist problemet. WebAssembly kunne være en løsning, men det kræver eksplicit indtastning af koden og er ikke velegnet til at fremskynde behandlingen af ​​eksisterende JavaScript-kode.

En anden mulighed er at levere færdiglavet kompileret bytekode i stedet for JavaScript-scripts, men udviklere af browsermotorer er imod det, fordi tredjeparts bytekode er svær at verificere, dens direkte behandling kan føre til web-stratificering, yderligere sikkerhedsrisici opstår og udvikling af et universelt bytekodeformat er påkrævet.

BinaryAST giver dig mulighed for at passe ind i din nuværende kodeudviklings- og leveringsmodel uden at oprette ny bytekode eller ændre JavaScript-sproget. Størrelsen af ​​data i BinaryAST-formatet kan sammenlignes med komprimeret minificeret JavaScript-kode, og behandlingshastigheden ved at eliminere kildetekstens parsing-fase øges mærkbart. Derudover tillader formatet kompilering til bytekode, når BinaryAST indlæses, uden at vente på, at alle data er færdige. Derudover giver parsing på serversiden dig mulighed for at udelukke ubrugte funktioner og unødvendig kode fra den returnerede BinaryAST-repræsentation, hvilket, når du parser på browsersiden, spilder tid på både at parse og transmittere unødvendig trafik.

En funktion ved BinaryAST er også evnen til at gendanne læsbar JavaScript, der ikke er helt den samme som den originale version, men er semantisk ækvivalent og indeholder de samme navne på variabler og funktioner (BinaryAST gemmer navne, men gemmer ikke information om positioner i kode, formatering og kommentarer). Den anden side af medaljen er fremkomsten af ​​nye angrebsvektorer, men ifølge udviklerne er de meget mindre og mere kontrollerbare, end når man bruger alternativer, såsom bytekode-distribution.

Test af facebook.com-koden viste, at parsing af JavaScript bruger 10-15 % af CPU-ressourcer, og at parsing tager mere tid end at generere bytekode og indledende kodegenerering til JIT. I SpiderMonkey-motoren tager tiden til fuldstændig opbygning af en AST 500-800 ms, og brugen af ​​BinaryAST har reduceret dette tal med 70-90%.
Generelt for det meste webfyrværkeri, når du bruger BinaryAST, reduceres JavaScript-parsingtiden med 3-10% i tilstanden uden optimering og med 90-97%, når tilstanden til at ignorere ubrugte funktioner er aktiveret.
Når du kørte et 1.2 MB JavaScript-testsæt, tillod brugen af ​​BinaryAST opstartstiden fra 338 til 314 ms på et desktopsystem (Intel i7) og fra 2019 til 1455 ms på en mobilenhed (HTC One M8).

Kilde: opennet.ru

Tilføj en kommentar