Kyiv Go Meetup maj 2018:

Presentatör: â Hej alla! Tack för att ni Ă€r hĂ€r! Idag har vi tvĂ„ officiella talare â Lyosha och Vanya. Det kommer att bli tvĂ„ till om vi har tid. Första talaren Ă€r Alexey Grachev, som kommer att berĂ€tta om GopherJS.
Alexey Grachev (hĂ€danefter â AG): â Jag Ă€r Go-utvecklare och jag skriver webbservrar i Go. Ibland mĂ„ste jag handskas med frontend, ibland gĂ„r jag in dĂ€r med hĂ€nderna. Jag vill berĂ€tta om mina erfarenheter och forskningar kring Go pĂ„ frontend.
Legenden sĂ€ger: först ska vi prata om varför vi vill köra Go pĂ„ frontend, sedan ska vi prata om hur vi kan göra det. Det finns tvĂ„ sĂ€tt â WebAssembly och GopherJS. LĂ„t oss se i vilket skick dessa lösningar Ă€r och vad som kan göras.
Vad Àr fel med frontend?
Ăr alla överens om att allt Ă€r bra med frontend?

För fÄ tester? LÄngsam byggprocess? Ekosystem? Bra.
NÀr det gÀller frontend gillar jag ett citat frÄn en av frontend-utvecklarna i hans bok:

I Javascript finns det inget typ-system. Nu kommer jag att nÀmna problem som jag har stött pÄ under mitt arbete och förklara hur de löses.
Ett typ-system Ă€r egentligen svĂ„rt att kalla ett typ-system i Javascript â det finns strĂ€ngar som representerar objekttypen, men det har egentligen ingenting med typer att göra. Detta problem har lösts i TypeScript (en överbyggnad ovanpĂ„ Javascript) och Flow (en statisk typkontroll för Javascript). Faktum Ă€r att frontend redan har nĂ„tt en lösning pĂ„ problemet med det dĂ„liga typ-systemet i Javascript.

Det finns ingen standardbibliotek i webblĂ€saren som sĂ„dan â det finns nĂ„gra inbyggda objekt och "magiska" funktioner i webblĂ€sare. Men jag skulle sĂ€ga att det standardbiblioteket i Javascript faktiskt saknas. Detta problem löstes för lĂ€nge sedan av jQuery (alla anvĂ€nde jQuery med alla prototyper, hjĂ€lpare och funktioner som Ă€r nödvĂ€ndiga för arbete). Nu anvĂ€nder alla Lodash:

Callback-hÀxan. Jag tror att alla har sett Javascript-kod för ungefÀr 5 Är sedan och att den liknade en "nudel" av otroliga sammanflÀtningar av callbacks. Nu har detta problem lösts (med utgivningen av ES-15 eller ES-16), man har lagt till promises till Javascript och alla kan andas lite lÀttare för en tid.

Tills Promice-hĂ€xan kom... Jag vet inte hur frontend-industrin lyckas, men de kör hela tiden in sig i underliga avgrunder. De lyckades ocksĂ„ skapa en "hĂ€xa" av promises. Sedan löste man detta problem genom att lĂ€gga till en ny primitiv â async/await:

Med asynkronitet Ă€r problemet löst. Async/await Ă€r en ganska populĂ€r konstruktion i olika sprĂ„k. I Python och andra finns det en sĂ„dan metod â den fungerar riktigt bra. Problemet Ă€r löst.
Vilket problem Àr inte löst? Den exponentiellt ökande komplexiteten i ramverk, komplexiteten i ekosystemet och sjÀlva programmen.

- Syntaxen i Javascript Àr lite konstig. Vi vet alla om problemen med att addera en array och ett objekt och andra knepigheter.
- Javascript Àr multiparadigmt. Just nu Àr det en sÀrskilt brÄdskande frÄga, nÀr ekosystemet Àr vÀldigt stort:
- alla skriver i olika stilar â nĂ„gra skriver strukturellt, andra skriver funktionellt, olika utvecklare skriver pĂ„ olika sĂ€tt;
- frÄn olika paket (packages) kommer olika paradigmer, nÀr du anvÀnder olika paket;
- det finns mycket "skoj" med funktionell programmering i Javascript â biblioteket ramda har dykt upp och nu kan ingen lĂ€sa program skrivna med det biblioteket.
- Det hÀr bidrar till en stor pÄverkan pÄ ekosystemet, och det har vÀxt otroligt. Paketen Àr inkompatibla med varandra: vissa anvÀnder promises, andra async/await, andra callbacks. Dessutom skriver man i olika paradigmer!
- Det leder till att projekt Àr svÄra att stödja. Det Àr svÄrt att hitta buggar om du inte kan lÀsa koden.
Vad Àr Web Assembly?
De modiga killarna frÄn Mozilla Foundation och en rad andra företag har kommit pÄ nÄgot som kallas Web Assembly. Vad Àr det?

- Det Àr en inbyggd virtuell maskin i webblÀsaren som stödjer ett binÀrt format.
- BinÀra program körs nÀstan som inbyggda program, det vill sÀga webblÀsaren behöver inte parsa all 'spagetti' Javascript-kod varje gÄng.
- Alla webblÀsare har meddelat stöd.
- Eftersom detta Àr bytekod kan man skriva en kompilator för vilket sprÄk som helst.
- De fyra största webblÀsarna levereras redan med stöd för Web Assembly.
- Snart förvÀntar vi oss nativt stöd i Go. En sÄdan ny arkitektur har redan lagts till: GOARCH=wasm GOOS=js (snart). Just nu Àr den, sÄvitt jag förstÄr, inte funktionell, men det finns ett uttalande om att det definitivt kommer att finnas i Go.
Vad ska man göra nu? GopherJS
Eftersom vi Ànnu inte har stöd för Web Assembly finns det en transpiler, GopherJS.

- Koden i Go transpileras till "ren" Javascript.
- Körs i alla webblĂ€sare â det finns inga nya funktioner som endast stöds av moderna webblĂ€sare (detta Ă€r Vanilla JS, som körs pĂ„ allt som helst).
- Det finns stöd för nĂ€stan allt som finns i Go, inklusive gorutiner och kanaler⊠â allt som vi Ă€lskar och kĂ€nner till.
- NĂ€stan hela standardbiblioteket stöds, förutom de paket som inte Ă€r meningsfulla att stödja i webblĂ€saren: syscall, nĂ€tverksinteraktioner (det finns en net/http-klient, men ingen server, och klienten emuleras via XMLHttpRequest). Ăverlag Ă€r hela standardbiblioteket tillgĂ€ngligt â hĂ€r Ă€r det i webblĂ€saren, hĂ€r Ă€r stdlib Go, som vi Ă€lskar.
- Hela paketekosystemet i Go, alla tredjepartslösningar (templating och liknande) kan kompileras med GopherJS och köras i webblÀsaren.
Att fĂ„ GopherJS Ă€r mycket enkelt â det Ă€r ett vanligt Go-paket. Vi kör go get, och vi har GopherJS-kommandot för att bygga applikationen:

SĂ„ hĂ€r ser ett litet hello world utâŠ

âŠEn vanlig Go-program, ett vanligt paket fmt frĂ„n standardbiblioteket och Binding Js för att nĂ„ webblĂ€sarens API. Println kommer slutligen att omvandlas till en console log och webblĂ€saren kommer att skriva "Hello gophers"! SĂ„ enkelt Ă€r det: vi gör GopherJS build â kör i webblĂ€saren â allt fungerar!
Vad finns för nÀrvarande? Bindningar

Det finns bindningar för alla populÀra js-ramverk:
- JQuery;
- Angular.js;
- D3.js för att skapa diagram och arbeta med stora datamÀngder;
- React.js;
- VueJS;
- det finns till och med stöd för Electron (sÄ vi kan redan nu skriva skrivbordsapplikationer med "Electron");
- och det mest underhĂ„llande â Ă€r WebGL (vi kan skapa fullgrafiska applikationer, inklusive spel med 3D-grafik, musik och alla funktioner);
- och mÄnga fler bindningar till alla populÀra javascript-ramverk och bibliotek.
Ramverk
- Det finns redan ett webbramverk som Ă€r speciellt utvecklat för GopherJS â Vecty. Detta Ă€r en fullstĂ€ndig analog av React.js, men utvecklad i Go, med GopherJS-specifikation.
- Det finns spelframeworks (överraskande nog!). Jag har hittat tvÄ av de mest populÀra:
- Engo;
- Ebiten.
Jag ska visa ett par exempel pÄ hur det ser ut och vad som redan kan skrivas i Go:

Eller det alternativet (jag hittade ingen 3D-shooter, men kanske finns det en):

Vad föreslÄr jag?
För nÀrvarande befinner sig frontend-industrin i ett sÄdant tillstÄnd, att alla sprÄk som tidigare klagade pÄ Javascript nu kommer att strömma dit. Nu kommer alla att kompilera till "Web Assembly". Vad behöver vi för att fÄ en vÀrdig plats dÀr som "gophers"?

I Go Àr det traditionellt sett en systemprogrammeringssprÄk, och det finns praktiskt taget inga bibliotek för att arbeta med UI. Det finns nÄgot, men det Àr halvövergivet och halvfunktionsdugligt.
Och nu har vi ett bra tillfĂ€lle att skapa UI-bibliotek pĂ„ Go som kan köras pĂ„ GopherJS! Ăntligen kan vi skriva vĂ„rt eget ramverk! Det Ă€r dags att skriva ett ramverk, och det kommer att vara ett av de första och fĂ„ tidig anpassning, och du kommer att bli en stjĂ€rna (om det Ă€r ett bra ramverk).
Vi kan anpassa mĂ€ngder av olika paket som redan finns i Go-ekosystemet för att passa webblĂ€sarens specifikationer (till exempel en templating-motor). De kommer redan att fungera, men vi kan skapa bekvĂ€ma omslag för att enkelt kunna rendera innehĂ„ll direkt i webblĂ€saren. Dessutom kan vi skapa en tjĂ€nst som kan rendera samma sak bĂ„de pĂ„ servern och klienten med samma kod â precis som frontend-utvecklare Ă€lskar (men nu pĂ„ Go).
Vi kan skriva ett spel! Bara för skojs skullâŠ
Det var allt frÄn mig.

FrÄgor
FrĂ„ga (hĂ€refter â F): â Skriver jag i Go eller i Js?
AG: â Du skriver med Go-rutiner, kanaler, strukturer, inbĂ€ddning â allt⊠Du prenumererar pĂ„ ett event och skickar dit en funktion.
L: â SĂ„ jag skriver i "ren" Js?
AG: â Nej, du skriver som om du anvĂ€nde Go och kopplar upp dig mot webblĂ€sarens API (API:t har förblivit oförĂ€ndrat). Du kan skriva dina egna omslag sĂ„ att meddelanden kommer till kanalen â det Ă€r ju inte svĂ„rt.
L: â Vad sĂ€gs om mobil?
AG: â Jag har absolut sett: det finns bindningar för Cordova som Js kör. I React Native â jag vet inte; kanske finns det, kanske inte (jag har inte varit sĂ„ intresserad). Spelmotorn N-go stödjer bĂ„de mobilapplikationer â bĂ„de iOS och Android.
L: â FrĂ„ga om Web Assembly. Det tar upp allt mer plats, trots komprimering och 'zipning'⊠Kommer vi att döda frontend-vĂ€rlden Ă€nnu mer pĂ„ det hĂ€r sĂ€ttet?
AG: â Web Assembly Ă€r ett binĂ€rt format, och per standard kan det inte vara större Ă€n text i den slutliga releasen⊠Du dras till runtime, men det Ă€r samma sak som att dra in JavaScripts standardbibliotek nĂ€r det inte finns, dĂ€rför anvĂ€nder vi nĂ„gon typ av Lodash. Jag vet inte hur mycket Lodash tar.
L: â Tydligt mindre Ă€n runtimeâŠ
AG: â I "rent" Javascript?
L: â Ja. Vi komprimerar det ju innan vi skickarâŠ
AG: â Men det hĂ€r Ă€r ju text⊠I allmĂ€nhet Ă€r en megabyte ganska mycket, men det Ă€r allt (du har hela runtime). Sedan skriver du din affĂ€rslogik som ökar din binĂ€rfil med 1 %. Jag ser inte att det dödar frontend. Dessutom kommer Web Assembly att fungera snabbare Ă€n Javascript av uppenbara skĂ€l â det behöver inte tolkas.
L: â Det Ă€r fortfarande en diskussionspunkt⊠Det finns Ă€nnu ingen standardimplementering av "Vasm" (Web Assembly) som gör att man kan döma entydigt. Konceptuellt â ja: vi förstĂ„r alla att binĂ€rfilen bör vara snabbare, men den nuvarande implementeringen av V8 Ă€r vĂ€ldigt effektiv.
AG: â Ja.
L: â Kompileringen fungerar verkligen mycket bra dĂ€r och det Ă€r inte sĂ€kert att det kommer att ge stora fördelar.
AG: â Stora killar jobbar ocksĂ„ med Web Assembly.
L: â Just nu verkar det som att det Ă€r svĂ„rt att döma om Web Assembly. Det har pratats i flera Ă„r, men verkliga framsteg som man kan ta pĂ„ Ă€r fĂ„.
AG: â Möjligt. Vi fĂ„r se.
L: â Vi har inga problem pĂ„ backend⊠Kanske borde vi lĂ€mna dessa problem till frontend? Varför ge oss in dĂ€r?
AG: â Vi mĂ„ste ha en personal av frontendare.

Lite reklam đ
Tack för att ni stannar kvar hos oss. Gillar ni vÄra artiklar? Vill ni se fler intressanta material? Stöd oss genom att göra en bestÀllning eller rekommendera oss till era vÀnner, , en unik motsvarighet till entry-level servrar som vi har skapat för er: (alternativ med RAID1 och RAID10 finns tillgÀngliga, upp till 24 kÀrnor och upp till 40GB DDR4).
Dell R730xd Ă€r tvĂ„ gĂ„nger billigare i datacentret Equinix Tier IV i Amsterdam? Bara hos oss i NederlĂ€nderna! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â frĂ„n $99! LĂ€s om
KĂ€lla: habr.com
