Alexey Grachev: Go Frontend

Kyiv Go Meetup maj 2018:

Alexey Grachev: Go Frontend

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?

Alexey Grachev: Go 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:

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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:

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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:

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

SÄ hÀr ser ett litet hello world ut


Alexey Grachev: Go Frontend


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

Alexey Grachev: Go Frontend

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

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

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.

Alexey Grachev: Go Frontend

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.

Spela video

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, moln-VPS för utvecklare frÄn $4,99, en unik motsvarighet till entry-level servrar som vi har skapat för er: Allt om VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps frÄn $19 eller hur man korrekt delar en server? (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 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100TB frĂ„n $199 i NederlĂ€nderna! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — frĂ„n $99! LĂ€s om Hur man bygger en företagsinfrastruktur med Dell R730xd E5-2650 v4-servrar som kostar 9000 euro för en brĂ„kdel?

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster