Alexey Grachev: Go Frontend

Kyiv Go Meetup Mai 2018:

Alexey Grachev: Go Frontend

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?

Alexey Grachev: Go Frontend

Testid on vĂ€hesed? Aeglane koostamine? ÖkosĂŒsteem? HĂ€sti.

Front-endi kohta meeldib mulle tsitaat, mille ĂŒtles ĂŒks front-end arendajatest oma raamatus:

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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:

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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:

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

Siin on selline vÀike tervitamine


Alexey Grachev: Go Frontend


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

Alexey Grachev: Go Frontend

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

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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.

MĂ€ngi videot

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. Pilve VPS arendajatele alates $4.99, ainulaadne entry-level 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 jagada serverit Ôigesti? (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 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199 Hollandis! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — alates $99! Lugege sellest Kuidas luua ettevĂ”tte tasemel infrastruktuuri, kasutades Dell R730xd E5-2650 v4 servereid, mille hind on 9000 eurot, taskukohase hinna eest?

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster