Aleksei Gračev: Go Frontend

Kyiv Go Meetup Mai 2018:

Aleksei Gračev: Go Frontend

Esitleja: – Tere kĂ”igile! AitĂ€h, et tulite! TĂ€na on meil kaks ametlikku esinejat – LjoĆĄa ja Vanya. Kui aega jÀÀb, on veel kaks. Esimene esineja on Aleksei Grachyov, kes rÀÀgib meile GopherJS-st.

Aleksei Grachyov (edaspidi – AG): – Olen Go-arendaja ja kirjutan veebiteenuseid Goga. MĂ”nikord tuleb mul tegeleda ka frontendiga, vahel tuleb sealt kĂ€sitsi sekkuda. Soovin jagada oma kogemust ja uurimusi Go-st frontendis.

Legend on selline: alustame vestlust, miks me soovime Go-d frontendis kĂ€ivitada, seejĂ€rel arutame, kuidas seda teha. On kaks teed – Web Assembly ja GopherJS. Vaatame, millises seisundis need lahendused on ja mida saab teha.

Mis on valesti frontendiga?

Kas kÔik on nÔus, et frontendis on kÔik hÀsti?

Aleksei Gračev: Go Frontend

Testide puudumine? Aeglane kogumine? ÖkosĂŒsteem? Hea kĂŒll.

Frontendist rÀÀkides meeldib mulle ĂŒks tsitaat, mille ĂŒtles ĂŒks frontend-arendaja oma raamatutes:

Aleksei Gračev: Go Frontend

Javascriptis ei ole tĂŒĂŒbivĂ”imet. NĂŒĂŒd hakkan nimetamisi probleeme, millega ma oma töös kokku puutusin, ja selgitama, kuidas neid lahendatakse.

TĂŒĂŒbivĂ”imet on tegelikult raske nimetada tĂŒĂŒbivĂ”imete sĂŒsteemiks Javascriptis – seal on stringid, mis tĂ€histavad objekti tĂŒĂŒpi, kuid tegelikult pole sellel tĂŒĂŒpidega mingit seost. Selle probleemi lahendas TypeScript (Javascripti pealisehitust) ja Flow (Javascripti staatiline kontrollija). Frontend on juba jĂ”udnud lahendama Javascripti halva tĂŒĂŒbivĂ”ime sĂŒsteemi probleemi.

Aleksei Gračev: Go Frontend

Brahvtifoodust standardset raamatukogu ei ole – on mĂ”ned sisseehitatud objektid ja „maagilised“ funktsioonid brauserites. JavaScriptis puudub standardne raamatukogu. Selle probleemi lahendas kunagi jQuery (kĂ”ik kasutasid jQuery-d koos kĂ”igi prototype’ide, abifunktsioonide ja funktsioonidega, mida oli vaja kasutada). NĂŒĂŒd aga kĂ”ik kasutavad Lodashi:

Aleksei Gračev: Go Frontend

Callback hell. Arvan, et kĂ”ik on nĂ€inud Javascripti koodi umbes viis aastat tagasi, ja see nĂ€gi vĂ€lja nagu „nuudli” jahtum, mis koosneb uskumatust callbackide ÀÀrimisest. NĂŒĂŒd on see probleem lahendatud (ES-15 vĂ”i ES-16 ilmumisega), Javascripti on lisatud lubadused (promises) ja kĂ”ik hingavad mĂ”nda aega kergemalt.

Aleksei Gračev: Go Frontend

Kuni tuleb Promise hell... Ma ei tea, kuidas frontenditööstus suudab, aga nad venduvad end igasugustesse kummalistesse jamadesse. Nad suutsid isegi „lubadustel” teha helli. Hiljem lahendati see probleem, lisades uue primitiivi – async/await:

Aleksei Gračev: Go Frontend

AsĂŒnkroonsuse probleem on lahendatud. Async/await – on ĂŒsna populaarne primitiiv erinevates keeltes. Pythonis ja muudes keeltes on selline lĂ€henemine olemas – see on vĂ€ga hea. Probleem on lahendatud.

Milline probleem ei ole lahendatud? Geomeetriliselt kasvav keerukus raamistike, ökosĂŒsteemi ja tegelikult programmide osas.

Aleksei Gračev: Go Frontend

  • Javascripti sĂŒntaks on veidi kummaline. KĂ”ik teame probleeme massiivi ja objekti liitmisel ja muid nalju.
  • Javascript on mitme paradigma sĂŒsteem. Praegu on see eriti aktuaalne, kus ökosĂŒsteem on vĂ€ga suur:
    • kĂ”ik kirjutavad erinevates stiilides – keegi kirjutab struktuurselt, keegi kirjutab funktsionaalset, erinevad arendajad kirjutavad erinevalt;
    • erinevatest pakettidest (packages) erinevad paradigmareeglid, kui kasutate erinevaid pakette;
    • on palju „meelelahutust” funktsionaalses programmeerimises Javascriptis – ilmus raamatukogu rambda ja nĂŒĂŒd ei suuda keegi lugeda selle raamatukogus kirjutatud programme.

  • See kĂ”ik toob ökosĂŒsteemile suure mĂ”ju ja see on tohutult kasvanud. Paketid ei ĂŒhildu ĂŒksteisega: keegi - lubadustel, keegi - async/await-s, keegi - callbackidel. Lisaks kirjutavad ja erinevates paradigmades!
  • See viib selleni, et projekti on keeruline toetada. Raskendat on leida tĂ”rge, kui te ei suuda koodi lugeda.

Mis on Web Assembly?

Tublid poisid Mozilla Foundationist ja mitmest muust ettevÔttest mÔtlesid vÀlja midagi sellist nagu Web Assembly. Mis see on?

Aleksei Gračev: Go Frontend

  • See on brauseris sisseehitatud virtuaalne masin, mis toetab binaarset formaati.
  • Binaarsed programmid saadetakse sinna, need tĂ€idetakse praktiliselt natiivsete vĂ”imalustega, mis tĂ€hendab, et brauser ei pea iga kord kogu „nuudli” Javascripti koodi parsima.
  • KĂ”ik brauserid on kinnitanud toetust.
  • Kuna see on baidikood, on vĂ”imalik kirjutada kompilaator mistahes keele jaoks.
  • Neli peamist brauserit on juba varustatud Web Assembly toe.
  • Peagi ootame Go loomulikku tuge. Selline uus arhitektuur on juba lisatud: GOARCH=wasm GOOS=js (peagi). Seni, nagu ma mĂ”istan, ei ole see funktsionaalne, kuid on avaldatud teadet, et see kindlasti tuleb Go-sse.

Mida praegu teha? GopherJS

Kuna meil ei ole Web Assembly tuge, on olemas selline transpiler nagu GopherJS.

Aleksei Gračev: Go Frontend

  • Go kood transpileerub „puhtaks” Javascriptiks.
  • KĂ€ivitatakse kĂ”ikides brauserites – seal ei ole uusi funktsioone, mida toetavad ainult kaasaegsed brauserid (see on Vanilla JS, mis töötab kĂ”iges, mis tahes seadmes).
  • Peaaegu kĂ”ik Go omadused, sealhulgas gorutiinid ja kanalid, on toetatud
 – kĂ”ik, mida me armastame ja tunneme.
  • Peaaegu kogu standardteek on toetatud, vĂ€lja arvatud need paketid, millel pole mĂ”tet brauseris töötada: syscall, neti suhtlemine (olemas on net/http klient, kuid serverit pole, klient emuleeritakse lĂ€bi XMLHttpRequest). KokkuvĂ”ttes on kogu standardteek saadaval – siin see on brauseris, siin on stdlib Go, mida me armastame.
  • Kogu Go paketi ökosĂŒsteemi, kĂ”ik kolmandate osapoolte lahendused (mallid jne) saab kompileerida GopherJS-iga ja kĂ€ivitada seda brauseris.

GopherJS-i hankimine on vĂ€ga lihtne – see on tavaline Go-pakett. Teeme go get ja meil on GopherJS kĂ€sk, et rakendust ehitada:

Aleksei Gračev: Go Frontend

Siin on selline vÀike hello world...

Aleksei Gračev: Go Frontend

...Tavaline Go programm, tavaline fmt paketist standardteegist ja Binding Js, et brauseri API-le ligi pÀÀseda. Println muudetakse lĂ”puks console logiks ja brauser kirjutab 'Hello gophers'! Nii lihtne: teeme GopherJS build – kĂ€ivitame brauseris – kĂ”ik töötab!

Mis on hetkel saadaval? Bindings

Aleksei Gračev: Go Frontend

On bindingeid kÔigile populaarsetele js-raamistikele:

  • JQuery;
  • Angular.js;
  • D3.js graafikute ja suurte andmete töötlemiseks;
  • React.js;
  • VueJS;
  • isegi on olemas tugi Electron'ile (praegu saame kirjutada lauaarvuti rakendusi 'Elecron'iga);
  • ja kĂ”ige huvitavam – see on WebGL (saame teha graafikarakendusi, sealhulgas 3D-mĂ€nge, muusikat ja kĂ”ike muud vajalikku);
  • ja vĂ€ga palju muid bindingeid kĂ”ikidele populaarsetele JavaScripti raamistikutele ja teekidele.

Framework

  1. GopherJS-ile on juba vĂ€lja töötatud spetsiaalne veebiraamistik – Vecty. See on tĂ€isfunktsionaalne analoog React.js-ile, kuid loodud Go keeles, GopherJS spetsiifikaga.
  2. On ka mĂ€nguteeke (ĂŒllatus!). Leidsin kaks populaarseimat:
    • Engo;
    • Ebiten.

Kannan paar nÀidet sellest, kuidas see vÀlja nÀeb ja mida on juba vÔimalik Go-s kirjutada:

Aleksei Gračev: Go Frontend

VÔi selline variant (3D-laskurite mÀngu ei leidnud, kuid vÔib-olla on see olemas):

Aleksei Gračev: Go Frontend

Mida ma ettepanen?

Praegu on frontend-tööstus sellises seisus, et igasugused keeled, mis varem nutsid JavaScripti pĂ€rast, tormavad sinna sisse. NĂŒĂŒd kompileeritakse kĂ”ik 'Web Assembly'. Mida me vajame, et seal 'gofiri' vÀÀrikas koht leida?

Aleksei Gračev: Go Frontend

Go keeles on traditsiooniliselt arvatud, et see on sĂŒsteemi programmeerimiskeel, ja praktiliselt puuduvad UI jaoks raamatukogud. Midagi on, kuid need on poolik, poolik funktsionaalne.

Ja nĂŒĂŒd on hea vĂ”imalus luua Go-s UI raamatukogud, mis töötavad GopherJS-is! Saame lĂ”puks kirjutada oma raamistikku! On see aeg, mil saame kirjutada raamistikku ja see saab olema ĂŒks esimesi ning omandab varajase kohandamise ning sina oled staar (kui see raamistik on hea).

Saame kohandada palju erinevaid pakette, mis juba on Go ökosĂŒsteemis, brauseri spetsiifiliseks (nt mallimootor). Need hakkavad töötama, saame mugavad ĂŒmberringed teha, et sisu oleks kerge brauseris renderdada. Pluss, saame teha nĂ€iteks teenuse, mis oskab renderdada sama serveris ja frontendis, kasutades sama koodi – just nii nagu frontend-arendajad armastavad (ainult nĂŒĂŒd Go-s).

VÔime kirjutada mÀngu! Just for fun...

Mul on kÔik.

Aleksei Gračev: Go Frontend

KĂŒsimused

KĂŒsimus (edasi – K): – Kas ma kirjutan Go-s vĂ”i Js-is?

AG: – Sa kirjutad Go rutaanide, kanalite, struktuuride, embedding – kĂ”ike
 Sa tellid event'i, edastad sinna funktsiooni.

K: – Kas see tĂ€hendab, et ma kirjutan 'puhtas' Js-is?

AG: – Ei, sa kirjutad nagu Go-s ja ĂŒhendud brauseri API-ga (API ei ole muudetud). Sa saad kirjutada oma ĂŒmberringed, et kanalisse tuleksid sĂ”numid – see ei ole keeruline.

K: – Kuidas on mobiiliga?

AG: – Olen kindlasti nĂ€inud: on olemas bindingeid Cordova patch'i jaoks, mida Js kĂ€ivitab. React Native – ei tea; vĂ”ib-olla on, aga vĂ”ib-olla ei ole (ei ole eriti uurinud). MĂ€ngu mootor N-go toetab ka mobiilirakendusi – nii iOs kui Android.

K: – KĂŒsimus Web Assembly kohta. Ruumi on aina rohkem, vaatamata kompressioonile, 'zipped'
 Kas me ei hĂ€vita sellega frontendmaailma veelgi rohkem?

AG: – Web Assembly on binaarne formaat ja binaarne ei saa vaikimisi lĂ”ppversioonis olla suurem kui tekst
 Teid tĂ”ukab runtime, kuid see on sama, mis JavaScripti standardteegi tĂ”ukamine, kui seda ei ole, seega kasutame mingit Lodashi. Ma ei tea, kui palju Lodash ruumi vĂ”tab.

K: – Kindlasti vĂ€hem kui runtime


AG: – 'Puhtas' JavaScriptis?

K: – Jah. Me ju kompressime selle enne saatmist


AG: – Aga see on ju tekst
 ÜhesĂ”naga, megabait on justkui palju, kuid see on kĂ”ik (sul on kogu runtime olemas). Edasi kirjutad oma Ă€riloogika, mis suurendab sinu binaari 1%. Seni ma ei nĂ€e, et see hĂ€vitaks frontend'i. Eriti arvestades, et Web Assembly töötab kiiremini kui JavaScript ilmselge pĂ”hjuse tĂ”ttu – seda ei pea analĂŒĂŒsima.

K: – Veel pole veel selget teavet
 Praegu ei ole mingit ideaalset rakendust "Web Assembly", et saaks ĂŒheselt hinnata. Kontseptuaalselt – jah: me kĂ”ik mĂ”istame, et binaar peab olema kiirem, kuid praegune V8 rakendus on vĂ€ga efektiivne.

AG: – Jah.

K: – Kompilleerimine töötab seal tĂ”eliselt hĂ€sti ja ei ole kindel, et see toob kaasa suurt eelist.

AG: – Web Assembly't arendavad ka suured tegijad.

K: – Praegu on mulle tundunud, et Web Assembly kohta on veel vara hinnangut anda. Mitu aastat on juba rÀÀgitud, kuid reaalseid saavutusi, mida katsuda, on vĂ€he.

AG: – VĂ”ib-olla. JĂ€tkame jĂ€lgimist.

K: – Meil ei ole probleeme backend'is
 Kas ei vĂ”iks neid probleeme jĂ€tta frontend'i? Miks peaks sinna sekkuma?

AG: – Peame hoidma fronthendi tiimi.

Vaata videot

Veidi reklaami 🙂

AitĂ€h, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite nĂ€ha rohkem huvitavaid materjale? Toetage meid, tehes tellimuse vĂ”i soovitades meid tuttavatele. pilve VPS arendajatele alates $4,99, ainulaadne sisenemise taseme serverite analoog, mille oleme teie jaoks vĂ€lja mĂ”elnud: Kogu tĂ”de VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps alates $19 vĂ”i kuidas Ă”ieti serverit jagada? (saadaval on RAID1 ja RAID10 variandid, kuni 24 sĂŒdamikku ja kuni 40GB DDR4).

Kas Dell R730xd on kaks korda odavam Equinixi Tier IV andmete keskuses Amsterdamis? Ainult meie juures 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199 Hollandi turul! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — alates $99! Lugege, kuidas Luua ettevĂ”tte tasemel infrastruktuur Dell R730xd E5-2650 v4 serveritega, mille hind on 9000 eurot, madala hinnaga?

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster