Cloudflare, Mozilla dhe Facebook zhvillojnë BinaryAST për të shpejtuar ngarkimin e JavaScript

Inxhinierë nga Cloudflare, Mozilla, Facebook dhe Bloomberg ofruar format i ri binarAST për të shpejtuar shpërndarjen dhe përpunimin e kodit JavaScript kur hapni sajte në një shfletues. BinaryAST merr fazën e analizimit në anën e serverit dhe siguron një pemë sintaksore abstrakte tashmë të formuar (AST). Me marrjen e BinaryAST, shfletuesi mund të shkojë menjëherë në fazën e përpilimit, duke anashkaluar analizimin e kodit burimor JavaScript.

Për testimin përgatitur zbatimi referencë i ofruar sipas licencës MIT. Për analizë, përdoren komponentët Node.js dhe kodi për optimizimin dhe gjenerimin e AST është shkruar në Rust. Mbështetja anësore e shfletuesit
BinaryAST është tashmë i disponueshëm në asambleja e natës Firefox. Enkoderi në BinaryAST mund të përdoret si në nivelin e paketës së veglave të faqes përfundimtare, ashtu edhe për paketimin e skripteve të sajteve të jashtme në anën e një përfaqësuesi ose rrjeti të shpërndarjes së përmbajtjes. Aktualisht, procesi i standardizimit të BinaryAST nga grupi i punës tashmë ka filluar. ECMA TC39, pas së cilës formati mund të bashkëjetojë me metodat ekzistuese të kompresimit të përmbajtjes së dhënë, si gzip dhe brotli.

Cloudflare, Mozilla dhe Facebook zhvillojnë BinaryAST për të shpejtuar ngarkimin e JavaScript

Cloudflare, Mozilla dhe Facebook zhvillojnë BinaryAST për të shpejtuar ngarkimin e JavaScript

Një kohë e konsiderueshme në përpunimin JavaScript merret nga faza e ngarkimit dhe analizimit të kodit. Duke marrë parasysh që sasia e JavaScript e shkarkuar në shumë site të njohura po i afrohet 10 MB (për shembull, për LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), përpunimi fillestar i JavaScript sjell një vonesë të konsiderueshme. Faza e analizimit në anën e shfletuesit është gjithashtu ngadalësuar për shkak të pamundësisë së ndërtimit të plotë të AST-it në fluturim ndërsa kodi ngarkohet (shfletuesi duhet të presë që blloqet e kodit të mbarojnë ngarkimin, për shembull, fundi i funksioneve, në në mënyrë që të merrni informacionin që mungon për të analizuar elementet aktuale).

Pjesërisht, ata përpiqen ta zgjidhin problemin duke shpërndarë kodin në një formë të minimizuar dhe të ngjeshur, si dhe duke ruajtur memorien e bajtkodit të gjeneruar nga shfletuesi. Në faqet moderne, kodi azhurnohet mjaft shpesh, kështu që ruajtja në memorie vetëm pjesërisht e zgjidh problemin. WebAssembly mund të jetë zgjidhja, por kërkon përdorimin e shtypjes së qartë të kodit dhe nuk është i përshtatshëm për përshpejtimin e përpunimit të kodit tashmë ekzistues JavaScript.

Një opsion tjetër është dërgimi i bytekodit të para-përpiluar në vend të skripteve JavaScript, por zhvilluesit e motorëve të shfletuesit janë kundër sepse bytekodi i palëve të treta është i vështirë për t'u verifikuar, përpunimi i tij i drejtpërdrejtë mund të çojë në shtresim në ueb, lindin rreziqe shtesë të sigurisë dhe zhvillimin e një kodi universal. Kërkohet formati i bytekodit.

BinaryAST ju lejon të përshtateni në modelin aktual të zhvillimit dhe shpërndarjes së kodit pa krijuar bajtkod të ri dhe pa ndryshuar gjuhën JavaScript. Madhësia e të dhënave në formatin BinaryAST është e krahasueshme me kodin e ngjeshur të minifikuar të JavaScript, dhe shpejtësia e përpunimit është rritur ndjeshëm për shkak të përjashtimit të fazës së analizimit të kodit burimor. Për më tepër, formati lejon përpilimin në bajtkod ndërsa ngarkohet BinaryAST, pa pritur që të gjitha të dhënat të merren. Për më tepër, analizimi në anën e serverit ju lejon të përjashtoni funksionet e papërdorura dhe kodin shtesë nga përfaqësimi i kthyer BinaryAST, i cili, kur analizohet në anën e shfletuesit, kërkon kohë për të analizuar dhe për të transmetuar trafik shtesë.

Një veçori e BinaryAST është gjithashtu aftësia për të rivendosur JavaScript të lexueshme që nuk përputhet me versionin origjinal, por është semantikisht ekuivalent dhe përfshin të njëjtat emra të variablave dhe funksioneve (BinaryAST ruan emrat, por nuk ruan informacione për pozicionet në kod, formatimin dhe komentet). Ana tjetër e medaljes është shfaqja e vektorëve të rinj të sulmit, por sipas zhvilluesve, ata janë shumë më të vegjël dhe më të kontrollueshëm se alternativat si shpërndarja e bytekodit.

Testet e kodit të Facebook.com kanë treguar se 10-15% e burimeve të CPU-së shpenzohen për analizimin e JavaScript dhe analizimi kërkon më shumë kohë sesa gjenerimi i bytekodit dhe gjenerimi fillestar i kodit për JIT. Në motorin SpiderMonkey, koha për të përfunduar ndërtimin e AST merr 500-800 ms, dhe përdorimi i BinaryAST e zvogëloi këtë shifër me 70-90%.
Në përgjithësi, për shumicën e fishekzjarreve në ueb, kur përdorni BinaryAST, koha e analizimit të JavaScript zvogëlohet me 3-10% në modalitetin pa optimizim dhe me 90-97% kur aktivizohet mënyra e injorimit të funksioneve të papërdorura.
Gjatë ekzekutimit të një grupi testimi JavaScript 1.2 MB, përdorimi i BinaryAST përshpejtoi kohën e nisjes nga 338 në 314 ms në një sistem desktop (Intel i7) dhe nga 2019 në 1455 ms në një pajisje celulare (HTC One M8).

Burimi: opennet.ru

Shto një koment