Kyiv Go Meetup Mai 2018:

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?

Testide puudumine? Aeglane kogumine? ĂkosĂŒsteem? Hea kĂŒll.
Frontendist rÀÀkides meeldib mulle ĂŒks tsitaat, mille ĂŒtles ĂŒks frontend-arendaja oma raamatutes:

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.

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:

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.

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:

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.

- 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?

- 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.

- 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:

Siin on selline vÀike hello world...

...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

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
- 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.
- 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:

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

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?

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.

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.

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. , ainulaadne sisenemise taseme serverite analoog, mille oleme teie jaoks vĂ€lja mĂ”elnud: (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 Hollandi turul! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â alates $99! Lugege, kuidas
Allikas: habr.com
