Aleksej Gračjov: Go Frontend

Kyiv Go Meetup Maj 2018:

Aleksej Gračjov: Go Frontend

VĂŠrt: – Hej alle sammen! Tak fordi I er her i dag! Vi har to officielle talere – LjĂžsha og Vania. Der kommer ogsĂ„ to til, hvis vi har tid. FĂžrste taler – Alexey Grachev, han vil fortĂŠlle os om GopherJS.

Alexey Grachev (herefter – AG): – Jeg er Go-udvikler, og jeg skriver webtjenester i Go. Nogle gange skal jeg indblande mig i frontend, og nogle gange mĂ„ jeg selv kaste mig ind i det. Jeg vil dele mine erfaringer og research om Go i frontend.

Legenden er sĂ„dan: FĂžrst taler vi om, hvorfor vi Ăžnsker at kĂžre Go i frontend, derefter diskuterer vi, hvordan det kan gĂžres. Der er to metoder – Web Assembly og GopherJS. Lad os se, hvor disse lĂžsninger stĂ„r, og hvad der kan gĂžres.

Hvad er galt med frontend?

Er alle enige om, at alt er godt med frontend?

Aleksej Gračjov: Go Frontend

Er der fÄ tests? Langsom samling? Økosystem? Godt.

Jeg kan godt lide en udtalelse fra en af frontend-udviklerne i hans bog:

Aleksej Gračjov: Go Frontend

I Javascript er der ikke noget typesystem. Nu vil jeg nÊvne problemer, jeg har mÞdt undervejs, og forklare, hvordan de hÄndteres.

Man kan overhovedet ikke kalde typesystemet i Javasript for et typesystem – der er strenge, der reprĂŠsenterer objekttypen, men de har faktisk ikke noget at gĂžre med typer. Dette problem er lĂžst i TypeScript (et lag oven pĂ„ Javasript) og Flow (en statisk typechecker for Javascript). GrundlĂŠggende er frontend allerede nĂ„et til en lĂžsning pĂ„ problemet med det dĂ„rlige typesystem i Javascript.

Aleksej Gračjov: Go Frontend

Der findes ikke en standardbibliotek i browseren som sĂ„dan – der er nogle indbyggede objekter og 'magiske' funktioner i browsere. Men jeg mener, at der ikke findes en standardbibliotek i Javascript. Dette problem blev engang lĂžst af jQuery (alle brugte jQuery med alle prototyper, hjĂŠlpere, funktioner der var nĂždvendige for arbejdet). I dag bruger alle Lodash:

Aleksej Gračjov: Go Frontend

Callback hell. Jeg tror, alle har set Javascript kode for omkring 5 Är siden, og det lignede en 'nudel' af et utroligt indviklet netvÊrk af callbacks. Denne problematik er nu lÞst (med introduktionen af ES-15 eller ES-16), da man tilfÞjede promises til Javascript, og alle fik lettere ved lige i et stykke tid.

Aleksej Gračjov: Go Frontend

Indtil Promice hell kom... Jeg ved ikke, hvordan frontend-industrien formĂ„r det, men de graver hele tiden sig selv ned i underlige afkroge. De fik ogsĂ„ skabt hell med 'promises'. SĂ„ lĂžste de dette problem ved at introducere et nyt primitiv – async/await:

Aleksej Gračjov: Go Frontend

Med asynkronitet er problemet lþst. Async/await er en ret populér konstruktion i forskellige sprog. I Python og andre sprog findes denne tilgang – den er rimeligt god. Problemet er lþst.

Hvilket problem er ikke lĂžst? Den geometrisk stigende kompleksitet af rammerne, kompleksiteten af Ăžkosystemet og selve programmerne.

Aleksej Gračjov: Go Frontend

  • JavaScripts syntaks er lidt underlig. Vi kender alle problemerne med at addere arrays og objekter og andre mĂŠrkvĂŠrdigheder.
  • JavaScript er multiparadigme. Dette er isĂŠr aktuelt nu, hvor Ăžkosystemet er meget stort:
    • alle skriver i forskellige stilarter – nogle skriver struktureret, andre skriver funktionelt, forskellige udviklere skriver pĂ„ forskellige mĂ„der;
    • fra forskellige pakker (packages) kommer der forskellige paradigmer, nĂ„r du bruger forskellige pakker;
    • der er meget 'sjov' med funktionel programmering i JavaScript – biblioteket Rambda er dukket op, og nu kan ingen lĂŠse programmer skrevet i dette bibliotek.

  • Dette bidrager til en stor impact i Ăžkosystemet, og det er vokset utrolig meget. Pakker er inkompatible med hinanden: nogle er baseret pĂ„ promises, nogle pĂ„ async/await, nogle pĂ„ callbacks. Der skrives ogsĂ„ i forskellige paradigmer!
  • Dette fĂžrer til, at det er svĂŠrt at vedligeholde projekter. Det er svĂŠrt at finde bugs, hvis du ikke kan lĂŠse koden.

Hvad er Web Assembly?

De dygtige folk fra Mozilla Foundation og flere andre virksomheder har opfundet noget, der hedder Web Assembly. Hvad er det?

Aleksej Gračjov: Go Frontend

  • Det er en indbygget virtuel maskine i browseren, der understĂžtter et binĂŠrt format.
  • Binarprogrammer bliver sendt derhen og kĂžrer nĂŠsten nativt, hvilket betyder, at browseren ikke behĂžver at parse al 'spaghetti' JavaScript-kode hver gang.
  • Alle browsere har erklĂŠret stĂžtte.
  • Da dette er bytekode, kan der skrives en compiler til ethvert sprog.
  • De fire hovedbrowserne leveres allerede med stĂžtte til Web Assembly.
  • Snart forventer vi nativer stĂžtte i Go. Denne nye arkitektur er allerede tilfĂžjet: GOARCH=wasm GOOS=js (snart). Indtil videre, som jeg forstĂ„r det, er den ikke funktionel, men der er en erklĂŠring om, at dette helt sikkert vil komme i Go.

Hvad skal vi gĂžre nu? GopherJS

Indtil vi fÄr stÞtte for Web Assembly, er der en transpiler ved navn GopherJS.

Aleksej Gračjov: Go Frontend

  • Koden i Go bliver transpilet til 'ren' JavaScript.
  • Det kĂžrer i alle browsere – der er ingen nye funktioner, som kun stĂžttes af moderne browsere (det er Vanilla JS, der kĂžrer pĂ„ alt, hvad som helst).
  • Der er stĂžtte for nĂŠsten alt, hvad der findes i Go, inklusive gorutiner og kanaler... - alt det, vi elsker og kender.
  • NĂŠsten hele standardbiblioteket understĂžttes, med undtagelse af de pakker, der ikke giver mening at understĂžtte i en browser: syscall, net-interaktioner (der er en net/http-klient, men ikke nogen server, og klienten emuleres via XMLHttpRequest). Generelt er hele standardbiblioteket tilgĂŠngeligt - her er det i browseren, her er stdlib Go, som vi elsker.
  • Hele Go-pakkeĂžkosystemet, alle tredjepartslĂžsninger (templating osv.) kan kompileres med GopherJS og kĂžres i browseren.

Det er meget nemt at fÄ GopherJS - det er en almindelig Go-pakke. Vi laver go get, og sÄ har vi GopherJS-kommandoen til at bygge applikationen:

Aleksej Gračjov: Go Frontend

Her er et lille hello world...

Aleksej Gračjov: Go Frontend

...En almindelig Go-applikation, det almindelige fmt-pakke fra standardbiblioteket og Binding Js til at tilgÄ browserens API. Println vil i sidste ende blive omdannet til et console log, og browseren vil skrive "Hello gophers"! SÄ nemt: vi laver GopherJS build - kÞrer i browseren - alt fungerer!

Hvad er der lige nu? Bindings

Aleksej Gračjov: Go Frontend

Der er bindings til alle populĂŠre JS-rammevĂŠrk:

  • JQuery;
  • Angular.js;
  • D3.js til graftegning og arbejdet med store data;
  • React.js;
  • VueJS;
  • der er endda stĂžtte for Electron (det vil sige, at vi allerede nu kan skrive desktopapplikationer med "Electron");
  • og det mest interessante - det er WebGL (vi kan lave holografiske applikationer, inklusive spil med 3D-grafik, musik og alle funktioner);
  • og rigtig mange andre bindings til alle populĂŠre JavaScript-rammevĂŠrk og biblioteker.

Framework

  1. Der findes allerede en web-ramme specifikt udviklet til GopherJS - Vecty. Det er en fuldgyldig pendant til React.js, men kun udviklet i Go, med specifikationen for GopherJS.
  2. Der findes endda spilmotorer (overraskende!). Jeg fandt to af de mest populĂŠre:
    • Engo;
    • Ebiten.

Jeg vil vise et par eksempler pÄ, hvordan det ser ud, og hvad der allerede nu kan skrives i Go:

Aleksej Gračjov: Go Frontend

Eller en sÄdan version (jeg fandt ikke en 3D-skyder, men mÄske findes den):

Aleksej Gračjov: Go Frontend

Hvad foreslÄr jeg?

Lige nu er frontend-industrien i en sÄdan tilstand, at alle sprog, der tidligere har ledet under Javascript, nu vil styrte ind. Nu vil alle blive kompileret til "WebAssembly". Hvad har vi brug for for at fÄ en vÊrdig plads som "gophers" der?

Aleksej Gračjov: Go Frontend

I Go er det traditionelt set, at det er et systemprogrammeringssprog, og der er nĂŠsten ingen biblioteker til UI-arbejde. Der findes noget, men det er halvmorsket og halvdelen ikke-funktionelt.

Og nu har vi et godt tidspunkt til at lave UI-biblioteker i Go, som kan kÞre pÄ GopherJS! Endelig kan vi skrive vores eget framework! Tiden er inde til at skrive et framework, og det vil vÊre et af de fÞrste og fÄ tidlig tilpasning, og du vil vÊre en stjerne (hvis det er et godt framework).

Det er muligt at tilpasse en lang rĂŠkke forskellige pakker, der allerede findes i Go-Ăžkosystemet, til specifikationen i browseren (for eksempel skabelonmotor). De kommer til at fungere, vi kan lave praktiske indpakninger, sĂ„ indhold nemt kan gengives direkte i browseren. Plus, vi kan lave en tjeneste, der kan gengive det samme pĂ„ serveren og frontend'en ved at bruge den samme kode – prĂŠcis som frontend-udviklere Ăžnsker det (men nu i Go).

Vi kan skrive et spil! Just for fun


Det var det for mig.

Aleksej Gračjov: Go Frontend

SpÞrgsmÄl

SpĂžrgsmĂ„l (herefter – S): – Skriver jeg i Go eller Js?

AG: – Du skriver Go-rutiner, kanaler, strukturer, embedding – alt sammen
 Du tilmelder dig en begivenhed og sender en funktion dertil.

Q: – SĂ„ jeg skriver i »ren« Js?

AG: – Nej, du skriver ligesom i Go og tilslutter dig til browserens API (API'en er forblevet uĂŠndret). Du kan skrive dine egne indpakninger, sĂ„ beskeder kommer ind i kanalen – det er ikke svĂŠrt.

Q: – Hvad med mobil?

AG: – Jeg har helt sikkert set: der er bindinger til Cordova-patch, som Js kĂžrer. I React Native – ved jeg ikke; mĂ„ske er der, mĂ„ske ikke (jeg har ikke interesseret mig sĂ„ meget). Spilmotoren N-go understĂžtter ogsĂ„ mobilapplikationer – bĂ„de iOs og Android.

Q: – SpĂžrgsmĂ„l om Web Assembly. Pladsen bliver mere og mere, pĂ„ trods af komprimering og »zip«... Vil vi ikke drĂŠbe frontend-verdenen endnu mere pĂ„ denne mĂ„de?

AG: – Web Assembly er et binĂŠrt format, og som standard kan binĂŠrt ikke vĂŠre stĂžrre end tekst i den endelige udgivelse... Du har brug for runtime, men det er det samme som at trĂŠkke den standardbibliotek Javascript ind, nĂ„r den ikke er der, derfor bruger vi noget som Lodash. Jeg ved ikke, hvor meget Lodash fylder.

Q: – Tydeligt mindre end runtime


AG: – I «rent» Javascript?

Q: – Ja. Vi komprimerer det jo, inden vi sender det


AG: – Men det er jo tekst
 Generelt set er en megabyte ret meget, men det er – alt sammen (du har hele runtime). Derefter skriver du din forretningslogik, som vil Ăžge din binary med 1 %. Indtil videre kan jeg ikke se, at det pĂ„virker frontend. Desuden vil Web Assembly kĂžre hurtigere end Javascript af Ă„benlyse grunde – det skal ikke parses.

Q: – Det er stadig et diskussionsemne
 Der er endnu ikke nogen standardimplementering af "Vasm" (Web Assembly), som gĂžr det muligt at bedĂžmme entydigt. Konceptuelt – ja: vi forstĂ„r alle, at binary skal vĂŠre hurtigere, men den nuvĂŠrende implementering af V8 er meget effektiv.

AG: – Ja.

Q: – Kompileringen fungerer virkelig meget godt, og der er ikke nogen garanti for, at der vil vére en stor fordel.

AG: – Store drenge arbejder ogsĂ„ med Web Assembly.

Q: – Jeg synes, det er svĂŠrt at dĂžmme om Web Assembly endnu. Der har vĂŠret snak om det i flere Ă„r, men der er ikke mange reelle resultater, der kan mĂŠrkes.

AG: – MĂ„ske. Vi mĂ„ se.

Q: – Vi har ingen problemer pĂ„ backend
 Skal vi ikke lade disse problemer ligge i frontend? Hvorfor skal vi blande os?

AG: – Vi er nþdt til at holde et hold af frontend-udviklere.

Afspil video

Lidt reklame 🙂

Tak fordi du bliver hos os. Kan du lide vores artikler? Ønsker du at se flere interessante materialer? StÞt os ved at bestille eller anbefale os til dine bekendte, cloud VPS til udviklere fra 4,99 $, en unik analog til entry-level servere, som vi har designet til dig: Alt om VPS (KVM) E5-2697 v3 (6 kerner) 10 GB DDR4 480 GB SSD 1 Gbps fra 19 $ eller hvordan man deler serveren korrekt? (tilgÊngelige muligheder med RAID1 og RAID10, op til 24 kerner og op til 40 GB DDR4).

Dell R730xd til halv pris i datacenteret Equinix Tier IV i Amsterdam? Kun hos os 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB fra 199 $ i Holland! Dell R420 - 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - fra 99 $! LĂŠs om hvordan man bygger enterprise-infrastruktur ved hjĂŠlp af Dell R730xd E5-2650 v4 servere til 9000 euro for en brĂžkdel af prisen?

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster