Kyiv Go Meetup Mai 2018:

Moderaator: â Tere kĂ”igile! AitĂ€h, et olete siin kohal! TĂ€na on meil kaks ametlikku esinejat â LŃĆĄa ja Vanya. Kui meil on piisavalt aega, tuleb veel kaks. Esimene esineja on Aleksei GraÄŃv, kes rÀÀgib meile GopherJS-ist.
Aleksei GraÄŃv (edaspidi â AG): â Ma olen Go-arendaja ja teen veebiteenuseid Go-s. MĂ”nikord tuleb mul tegeleda ka front-endiga, vahel pean sinna ise kĂ€ega kallale minema. Soovin rÀÀkida oma kogemusest ja uuringutest Go-s front-endis.
Legendi kohaselt: esmalt rÀÀgime, miks me tahame Go-d front-endis kĂ€ivitada, ja seejĂ€rel rÀÀgime, kuidas seda teha. On kaks teed â Web Assembly ja GopherJS. Vaatame, millises seisus need lahendused on ja mida on vĂ”imalik teha.
Mis on valesti front-endiga?
Kas kÔik on nÔus, et front-end on hÀsti korras?

Testid on vĂ€hesed? Aeglane koostamine? ĂkosĂŒsteem? HĂ€sti.
Front-endi kohta meeldib mulle tsitaat, mille ĂŒtles ĂŒks front-end arendajatest oma raamatus:

Javascriptis puudub tĂŒĂŒbihĂŒvitise sĂŒsteem. NĂŒĂŒd hakkan mainima probleeme, millega olen oma töös kokku puutunud, ja selgitan, kuidas neid lahendatakse.
TĂŒĂŒbihĂŒvitise sĂŒsteemi on raske nimetada tĂŒĂŒbihĂŒvitise sĂŒsteemiks Javascriptis â seal on stringid, mis tĂ€histavad objekti tĂŒĂŒpi, kuid see ei ole tegelikult omavahel seotud tĂŒĂŒpidega. See probleem on lahendatud TypeScriptis (Javascripti pealiskihis) ja Flow-s (Javascripti tĂŒĂŒpide staatiline kontrollija). Tegelikult on front-end juba jĂ”udnud lahenduseni Javascripti kehva tĂŒĂŒbihĂŒvitise probleemi osas.

Brahvis pole sellist standardset teeki olemas â seal on mĂ”ned sisseehitatud objektid ja "maagilised" funktsioonid brauserites. Kuid Javascriptis puudub selline standardne teek. See probleem lahendati kunagi jQuery abil (kĂ”ik kasutasid jQuery-d koos kĂ”igi prototĂŒĂŒpide, abifunktsioonide ja funktsioonidega, mis on tööks vajalikud). Praegu kasutab kĂ”ik Lodashi:

Callback-i pĂ”rgu. Arvan, et kĂ”ik on nĂ€inud koodi Javascriptis umbes 5 aastat tagasi, ja see nĂ€gi vĂ€lja nagu "nuudli" imeline hargnemine callbackidest. NĂŒĂŒd on see probleem lahendatud (koos ES-15 vĂ”i ES-16 tulekuga), Javascriptisse on lisatud lubadused (promises) ja kĂ”ik saavad hetkeks kergemalt hingata.

Kuni Promice-i pĂ”rguni⊠Ei tea, kuidas front-end tööstus suudab, aga nad ajavad end pidevalt kummalistesse olukordadesse. Nad suutsid teha pĂ”rgu ka "lubadustes". SeejĂ€rel lahendati probleem, lisades uue primaadi â async/await:

AsĂŒnkroonsuse probleem on lahendatud. Async/await on erinevates keeltes ĂŒsna populaarne primitiiv. Pythonis ja mujal on selline lĂ€henemine ja see on ĂŒsna hea. Probleem on lahendatud.
Milline probleem on lahendamata? Geomeetrilise progressiooniga kasvavad raamistikud, ökosĂŒsteemi keerukus ja programmeerimine ise.

- JavaScripti sĂŒntaks on veidi kummaline. Me kĂ”ik teame muresid massiivi ja objekti liitmisega ning teisi nalju.
- JavaScript on mitme paradigma keel. Praegu on see eriti aktuaalne sĂŒsteem, kui ökosĂŒsteem on vĂ€ga suur:
- kĂ”ik kirjutavad erinevates stiilides â mĂ”ned kirjutavad strukturaalselt, mĂ”ned funktsionaalselt, erinevad arendajad kirjutavad erinevalt;
- erinevatest paketidest erinevad paradigmata, kui kasutate erinevaid pakette;
- funktsionaalse programmeerimisega seondub JavaScriptis palju "nalja" â vĂ€lja tuli rambda teek ja nĂŒĂŒd ei suuda keegi lugeda selle teegi raames kirjutatud programme.
- See kĂ”ik toob ökosĂŒsteemi suurte mĂ”jude, ja see on uskumatu suurenenud. Paketid ei ĂŒhildu omavahel: mĂ”ned kasutavad lubadusi, teised async/await, mĂ”ned kolmanda osapoole funktsioonide pĂ”hjal. Ja nad kirjutavad ka erinevates paradigmas!
- See viib selleni, et projekti on raske toetada. Vigade leidmine on keeruline, kui te ei suuda koodi lugeda.
Mis on Web Assembly?
Julged vennad Mozilla Fondist ja mitmetest teistest ettevÔtetest tulid vÀlja sellise asjaga nagu Web Assembly. Mis see on?

- See on brauserisse sisseehitatud virtuaalmasin, mis toetab binaarset formaati.
- Binaarsed programmid jĂ”uavad sinna, neid tĂ€idetakse praktiliselt natiivselt, see tĂ€hendab, et brauser ei pea iga kord kogu JavaScripti ânuudlitâ parsiima.
- KÔik brauserid on vÀljendanud toetust.
- Kuna see on baitkood, vÔib mis tahes keele jaoks kirjutada kompilaatori.
- Neli peamist brauserit juba toetavad Web Assembly't.
- Peagi ootame natiivset tuge Go jaoks. Selline uus arhitektuur on juba lisatud: GOARCH=wasm GOOS=js (varsti). Praegu, nagu ma aru saan, ei ole see funktsionaalne, kuid on teadaanne, et see kindlasti tuleb Go'sse.
Mida teha praegu? GopherJS
Kuna meil ei ole Web Assembly tuge, on olemas selline transpailija nagu GopherJS.

- Go kood transpileeritakse âpuhtaksâ JavaScriptiks.
- KÀivitub kÔikides brauserites - seal pole uusi funktsioone, mida toetavad ainult uuemad brauserid (see on Vanilla JS, mis töötab igal pool).
- Peaaegu kĂ”ik, mis Go-s on, on toetatud, sealhulgas gorutiinid ja kanalid⊠â kĂ”ik, mida me armastame ja tunneme.
- Peaaegu kogu standardraamatukogu on toetatud, vĂ€lja arvatud need paketid, mille toetamine brauseris pole mĂ”ttekas: syscall, vĂ”rguvahetused (on net/http klient, kuid ei ole serverit, klient simuleeritakse lĂ€bi XMLHttpRequest). Ăldiselt on kogu standardraamatukogu saadaval â siin see on brauseris, siin on stdlib Go, mida me armastame.
- Go paketi kogu ökosĂŒsteem, kĂ”ik kolmanda osapoole lahendused (mallide loomine jne) saab kompileerida GopherJS-i abil ja seda brauseris kĂ€ivitada.
GopherJS-i hankimine on vĂ€ga lihtne â see on tavaline Go-pakett. Teeme go get, ja meil on GopherJS-i kĂ€sk, et rakendust ehitada:

Siin on selline vĂ€ike tervitamineâŠ

âŠTavaline Go programm, tavaline fmt standardraamatukogu ja JavaScripti sidumine, et pÀÀseda brauseri API-le. Println muudetakse lĂ”puks konsoli logiks ja brauser kirjutab âTere, gopheridâ! Nii lihtne: teeme GopherJS build â kĂ€ivitame brauseris â kĂ”ik töötab!
Mis praegu olemas on? Sidumised

On sidumised kÔigi populaarsete js-raamistikega:
- JQuery;
- Angular.js;
- D3.js graafikute loomise ja suurte andmete töötlemiseks;
- React.js;
- VueJS;
- isegi Electroni tugi (st juba praegu saame kirjutada lauaarvuti rakendusi "Electronis");
- ja kĂ”ige huvitavam â see on WebGL (saame teha tĂ€isgraafilisi rakendusi, sealhulgas mĂ€nge 3D-graafikaga, muusika ja kĂ”igi hĂ€id asjadega);
- ja vÀga palju muid sidumisi kÔigi populaarsete javascript-raamistike ja -raamatukogudega.
Raamistik
- On juba loodud spetsiaalselt GopherJS-le veebiraamistik â Vecty. See on tĂ€ieĂ”iguslik React.js analoog, kuid ainult Go-s vĂ€lja töötatud, GopherJS-i spetsiifikaga.
- On mĂ€nguraamatud (ĂŒllatavalt!). Leidsin kaks kĂ”ige populaarsemat:
- Engo;
- Ebiten.
Demonstreerin paar nÀidet, kuidas see vÀlja nÀeb ja mida juba praegu Go-s kirjutada saab:

VÔi selline variant (3D-shooterit ei leidnud, kuid ehk see eksisteerib):

Mida ma pakun?
Praegu on esikĂŒlje tööstus sellises seisus, et sinna tĂ”ttavad kĂ”ik keeled, mis varem hĂ€das olid Javascriptiga. NĂŒĂŒd kompileeritakse kĂ”ik âWeb Assemblyâ juurde. Mida meil on vaja, et seal vÀÀrikas koht vĂ”tta kui âgopheridâ?

Go on traditsiooniliselt, et see on sĂŒsteemide programmeerimiskeel ja praktiliselt pole ĂŒhtegi teeki kasutajaliidese jaoks. Midagi on olemas, kuid see on osaliselt hĂŒljatud ja osaliselt mittefunktsionaalne.
Ja siin on hea vĂ”imalus luua Go-s kasutajaliidese teeke, mis töötavad GopherJS-il! LĂ”puks saab kirjutada oma raamistiku! On aeg kirjutada raamistiku, mis on ĂŒks esimesi ja saab varajase kohandamise ning sina oled tĂ€ht (kui see raamistiku on hea).
Saab kohandada palju erinevaid pakette, mis juba on Go ökosĂŒsteemis, brauseri spetsiifika jaoks (nĂ€iteks mallide mootor). Need töötavad juba, saab luua mugavaid wrapper'eid, et saaks hĂ”lpsasti sisu otse brauseris renderdada. Pluss, saa teha nĂ€iteks teenuse, mis oskab renderdada samu asju serveris ja frontendis, kasutades sama koodi â just nii, nagu frontendi arendajad armastavad (ainult et nĂŒĂŒd Go-s).
Saab kirjutada mĂ€ngu! Lihtsalt lĂ”bu pĂ€rastâŠ
Minu poolt kÔik.

KĂŒsimused
KĂŒsimus (edasi â K): â Ma kirjutan Go-s vĂ”i Js-is?
AG: â Sa kirjutad Go gorutine, kanalid, struktuurid, umbrohustamine â kĂ”ik⊠Sa tellid sĂŒndmuse, edastad sinna funktsiooni.
K: â Kas ma siis kirjutan 'puhtas' Js-is?
AG: â Ei, sa kirjutad nagu Go-s ja ĂŒhendatud API-ga brauseris (API on samasugune). Sa saad kirjutada oma wrapper'id, et kanalisse tuleksid sĂ”numid â see pole keeruline.
K: â Kuidas mobiiliga?
AG: â Ma olen kindlasti nĂ€inud: on Cordova jaoks sidumisi, mida Js kĂ€ivitab. React Native'i kohta ei tea; vĂ”ib-olla on, aga vĂ”ib-olla pole (ei huvitanud eriti). MĂ€ngumootor N-go toetab ka mobiilirakendusi â nii iOS-i kui Androidi.
K: â KĂŒsimus Web Assembly kohta. Ruumi vĂ”tab jĂ€rjest rohkem, vaatamata kompaktimisele, 'zippimisele'⊠Kas me tapame niimoodi frontendi maailma veel rohkem?
AG: â Web Assembly on binaarvormaat ja binaarne ei saa vaikimisi lĂ”ppversioonis olla suurem kui tekst⊠Sul on meeles runtime, kuid see on sama, mis standardse JavaScripti teegi toomine, kui seda ei ole, seega kasutame mingit Lodashi. Ma ei tea, kui palju Lodash vĂ”tab.
K: â Kindlasti vĂ€hem kui runtimeâŠ
AG: â 'Puhtas' Javascriptis?
K: â Jah. Me ju kokkupaneme selle enne saatmistâŠ
AG: â Aga see on tekst⊠ĂhesĂ”naga, megabait on nagu palju, aga see on â kĂ”ik (sul on kogu runtime). SeejĂ€rel kirjutad oma Ă€ri-logika, mis suurendab sinu binaari 1% vĂ”rra. Seni ei nĂ€e ma, et see frontendi tapaks. Eriti arvestades, et Web Assembly töötab kiiremini kui Javascript, ilmselge pĂ”hjuse tĂ”ttu â seda ei pea parsima.
K: â Hetkel on see vaieldav punkt⊠Veel ei ole mingit standardset elluviimist âVasmastâ (Web Assembly), et saaks ĂŒheselt otsustada. Kontseptuaalselt â jah: me kĂ”ik mĂ”istame, et binaar peaks olema kiirem, aga praegune elluviimine, nagu V8, on vĂ€ga tĂ”hus.
AG: â Jah.
K: â Kompileerimine töötab seal tĂ”eliselt hĂ€sti ja pole kindel, et suur eelis tuleb.
AG: â Web Assembly'ga tegelevad ka suurte ettevĂ”tete tegijad.
K: â Hetkel tundub, et Web Assembly kohta on veel keeruline otsustada. Juba aastaid on rÀÀgitud, aga reaalseid saavutusi, mida saaks katsuda, on vĂ€he.
AG: â VĂ”ib-olla. Oleme vaatamas.
K: â Meil pole probleeme backendis⊠Kas oleks parem jĂ€tta need probleemid frontendisse? Miks sinna vĂ€gisi minna?
AG: â Peame hoidma frontendi spetsialiste.

Veidi reklaami đ
AitÀh, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite nÀha rohkem huvitavat sisu? Toetage meid, tellides teenuse vÔi soovitades meid tuttavatele. , ainulaadne entry-level serverite analoog, mille oleme teie jaoks vÀlja mÔelnud: (saadaval RAID1 ja RAID10 variandid, kuni 24 tuuma ja kuni 40GB DDR4).
Dell R730xd on Equinixi Tier IV andmekeskuses Amsterdamis kaks korda odavam? Ainult meie juures Hollandis! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â alates $99! Lugege sellest
Allikas: habr.com
