Kyiv Go Meetup di maghju 2018:
Moderatore: - Salute à tutti ! Grazie per esse quì! Oghje avemu dui parlanti ufficiali - Lyosha è Vanya. Ci sarà dui altri s'è avemu abbastanza tempu. U primu parlante hè Alexey Grachev, ci hà da parlà di GopherJS.
Alexey Grachev (in seguitu - AG): - Sò un sviluppatore Go, è scrivu servizii web in Go. Calchì volta vi tocca à trattà cù u frontend, à volte ci vole à entre in lu manually. Vogliu parlà di a mo spirienza è di ricerca in Go in u frontend.
A legenda hè questu: prima parlemu per quessa chì vulemu correre Vai nantu à u frontend, dopu parlemu di cumu si pò fà. Ci sò dui modi - Web Assembly è GopherJS. Videmu quale hè u statutu di sti suluzioni è ciò chì si pò fà.
Chì ci hè di male cù u frontend?
Tutti sò d'accordu chì tuttu hè bè cù u frontend?
Ùn ci sò micca abbastanza teste? Custruzzione lenta? Ecosistema ? Va bè.
In quantu à u frontend, mi piace a citazione chì unu di i sviluppatori di frontend hà dettu in u so libru:
Javascript ùn hà micca un sistema di tipu. Avà nome i prublemi chì aghju scontru in u cursu di u mo travagliu è spiegheraghju cumu si sò risolti.
U sistema di tipu in generale ùn pò micca esse chjamatu un sistema di tipu in Javasript - ci sò linii chì indicanu u tipu di l'ughjettu, ma in fattu questu ùn hà nunda di fà cù i tipi. Stu prublema hè risolta in TypeScript (un add-on à Javasript) è Flow (un verificatore static-type in Javascript). In verità, u frontend hà digià righjuntu u puntu di risolve u prublema di un sistema di tippu male in Javascript.
Ùn ci hè micca una biblioteca standard in u navigatore cum'è tali - ci sò qualchi oggetti integrati è funzioni "magiche" in i navigatori. Ma in Javascript ùn ci hè micca una biblioteca standard cum'è tali. Stu prublema era digià risolta una volta da jQuery (tutti anu utilizatu jQuery cù tutti i prototipi, aiutanti, funzioni chì eranu necessarii per travaglià). Avà tutti usanu Lodash:
Chjama l'infernu. Pensu chì tutti anu vistu u codice Javascript circa 5 anni fà, è pareva un "noodle" di una intricata intricatu di callbacks. Avà stu prublema hè stata risolta (cù a liberazione di ES-15 o ES-16), e prumesse sò state aghjunte à Javascript è ognunu pò respira più faciule per un tempu.
Finu à chì l'infernu di Promice hè ghjuntu ... Ùn sò micca sapè cumu gestisce l'industria di u front-end, ma sempre si guidanu in una jungla strana. Avemu ancu riesciutu à fà l'infernu nantu à e prumesse. Allora risolvemu stu prublema aghjunghjendu un novu primitivu - async/wait:
U prublema cù l'asincronia hè risolta. Async/wait hè un primitivu abbastanza populari in diverse lingue. Python è altri anu stu approcciu - hè abbastanza bè. Prublemu risoltu.
Chì prublema ùn hè micca risolta? A cumplessità in crescita esponenziale di i quadri, a cumplessità di l'ecosistema è i prugrammi stessi.
- A sintassi Javascript hè un pocu strana. Tutti sapemu i prublemi cù l'aghjunghje un array è un ughjettu è altri scherzi.
- Javascript hè multi-paradigma. Questu hè un sistema particularmente pressante avà quandu l'ecosistema hè assai grande:
- ognunu scrive in stili diffirenti - alcuni scrive strutturalmente, alcuni scrivenu funziunale, diversi sviluppatori scrivenu in modi diffirenti;
- da diverse pacchetti, diversi paradigmi quandu utilizate diversi pacchetti;
- Ci hè assai "divertimentu" cù a prugrammazione funziunale in Javasript - a biblioteca rambda hè apparsu è avà nimu pò leghje i prugrammi scritti in questa biblioteca.
- Tuttu chistu face un grande impattu annantu à l'ecosistema, è hè crisciutu incredibbilmente. I pacchetti sò incompatibili cù l'altri: alcuni sò basati nantu à e prumesse, certi sò basati in async/wait, certi sò basati in callbacks. Scrivenu ancu in diversi paradigmi !
- Questu rende u prughjettu difficiule di mantene. Hè difficiuli di truvà un bug si ùn pudete micca leghje u codice.
Cosa hè Web Assembly?
I coraggiosi di a Fundazione Mozilla è di parechje altre cumpagnie sò venuti cun una cosa cum'è Web Assembly. Chì ghjè stu?
- Questa hè una macchina virtuale integrata in u navigatore chì sustene u formatu binariu.
- I prugrammi binari ghjunghjenu quì è sò eseguiti quasi nativamente, vale à dì chì u navigatore ùn hà micca bisognu di analizà tutti i "noodles" di codice javascript ogni volta.
- Tutti i navigatori anu dichjaratu supportu.
- Siccomu questu hè bytecode, pudete scrive un compilatore per ogni lingua.
- Quattru navigatori principali sò digià spedite cù supportu Web Assembly.
- Aspittemu un supportu nativu in Go prestu. Sta nova architettura hè digià aghjuntu: GOARCH=wasm GOOS=js (prestu). Finu a ora, cum'è l'aghju capitu, ùn hè micca funziunale, ma ci hè una dichjarazione chì serà sicuramente in Go.
Chì fà avà ? Gopher JS
Mentre ùn avemu micca supportu per Web Assembly, ci hè un transpiler cum'è GopherJS.
- U codice Go hè traspilatu in Javascript "puru".
- Funziona in tutti i navigatori - ùn ci sò micca funziunalità novi chì sò supportati solu da i navigatori muderni (questu hè Vanilla JS, chì funziona nantu à qualcosa).
- Ci hè un supportu per quasi tuttu ciò chì Go hà, cumprese goroutines è canali ... tuttu ciò chì amemu è sapemu tantu.
- Quasi tutta a libreria standard hè supportata, eccettu per quelli pacchetti chì ùn hà micca sensu di supportà in u navigatore: syscall, interazzioni netti (ci hè un cliente net/http, ma senza servitore, è u cliente hè emulatu via XMLHttpRequest). In generale, tutta a biblioteca standard hè dispunibule - quì hè in u navigatore, quì hè u stdlib di Go, chì ci piace.
- L'ecosistema tutale di u pacchettu in Go, tutte e soluzioni di terzu (template, etc.) ponu esse compilate cù GopherJS è eseguite in u navigatore.
GopherJS hè assai faciule d'acquistà - hè solu un pacchettu Go regulare. Andemu per piglià, è avemu un cumandamentu GopherJS per custruisce l'applicazione:
Questu hè un bellu mondu cusì chjucu ...
...Un prugramma Go regulare, un pacchettu fmt di libreria standard regulare è Binding Js per ghjunghje à l'API di u navigatore. Println serà eventualmente cunvertitu in u logu di a cunsola è u navigatore scriverà "Hello gophers"! Hè cusì simplice: facemu a creazione di GopherJS - lanciamu in u navigatore - tuttu funziona!
Chì avete in u mumentu ? Legami
Ci sò ligami per tutti i framework js populari:
- JQuery;
- Angular.js;
- D3.js per plotting è travaglià cù big data;
- React.js;
- VueJS;
- ci hè ancu supportu per Electron (vale à dì, pudemu digià scrive l'applicazioni desktop nantu à Electron);
- è a cosa più divertente hè WebGL (pudemu fà appiicazioni gràfiche cumplete, cumpresi ghjochi cù gràficu 3D, musica è tutti i boni);
- è parechje altre associazioni à tutti i frameworks javascript è biblioteche populari.
Framework
- Ci hè un framework web digià sviluppatu apposta per GopherJS - Vecty. Questu hè un analogu cumpletu di React.js, ma solu sviluppatu in Go, cù e specifiche di GopherJS.
- Ci sò sacchetti di ghjocu (sorpresa!). Aghju trovu i dui più populari:
- Engo;
- Ebiten.
Vi mustraraghju un paru di esempi di ciò chì pare è ciò chì pudete digià scrive in Go:
O questa opzione (ùn aghju micca pussutu truvà un shooter 3D, ma forse esiste):
Chì offre ?
Avà l'industria front-end hè in tale statu chì tutte e lingue chì prima gridavanu da Javascript si precipiteranu quì. Avà tuttu serà cumpilatu in "Assemblee Web". Chì avemu bisognu di piglià u nostru postu chì ci hè ghjustu cum'è Gophers?
Go hà tradiziunale assume chì hè una lingua di prugrammazione di u Sistema, è ùn ci sò praticamenti micca biblioteche per travaglià cù l'UI. Ci hè qualcosa, ma hè mezu abbandunatu, mità micca funziunale.
È avà hè una bona chance per fà biblioteche UI in Go chì correranu nantu à GopherJS! Pudete finalmente scrive u vostru propiu quadru! Questu hè u tempu quandu pudete scrive un quadru, è serà unu di i primi è uttene l'adopzione anticipata, è sarete una stella (se hè un bonu quadru).
Pudete adattà assai pacchetti diffirenti chì sò digià in l'ecosistema Go à e specifiche di u navigatore (per esempiu, Template engine). Anu digià travagliatu, pudete fà ligami convenienti in modu chì pudete facilmente rende u cuntenutu direttamente in u navigatore. In più, pudete fà, per esempiu, un serviziu chì pò rende a stessa cosa in u servitore è in u front-end, usendu u listessu codice - tuttu ciò chì i sviluppatori front-end piace (solu avà in Go).
Pudete scrive un ghjocu! Solu per piacè ...
Hè tuttu ciò chì vulia dì.
I vostri dumanni
Quistione (in seguitu chjamata Q): – Scrivu in Go o Js ?
AG: - Scrivite rutini, canali, strutture, incrussioni - tuttu in Go... Avete sottumessu à un avvenimentu, passa una funzione quì.
IN: – Allora scrivu in Js “nudu” ?
AG: - No, scrivite cum'è in Go è cunnette cù l'API di u navigatore (l'API ùn hè micca cambiatu). Pudete scrive u vostru propiu ligami per chì i missaghji sò mandati à u canali - ùn hè micca difficiule.
IN: - E mobile ?
AG: - Aghju definitivamente vistu: ci sò ligami per u patch Cordova chì Js corre. In React Native - Ùn sò micca; forsi ci hè, forse micca (ùn era micca particularmente interessatu). U mutore di ghjocu N-go supporta e duie applicazioni mobili - sia iOS sia Android.
IN: - Quistione nantu à l'Assemblea Web. Sempre più spaziu hè occupatu, malgradu a cumpressione è u "zipping"... Ùn uccideremu micca u mondu front-end in questu modu ancu di più ?
AG: - Web Assembly hè un formatu binariu, è u binari per difettu ùn pò micca esse in a versione finale più di u testu ... Vi sò attirati à runtime, ma questu hè u listessu cum'è trascinendu a libreria Javascript standard quandu ùn hè micca quì, cusì avemu aduprà un pocu di Lodash. Ùn sò micca quantu piglia Lodash.
IN: - Ovviamente menu di runtime ...
AG: - In Javascript "puru"?
IN: - Iè. Cumpressemu prima di mandà lu...
AG: - Ma questu hè testu... In generale, un megabyte pare assai, ma questu hè tuttu (avete tuttu u runtime). In seguitu, scrivite a vostra propria logica cummerciale, chì aumenterà u vostru binariu da 1%. Finu à avà ùn vecu micca questu uccidendu u frontend. Inoltre, Web Assembly hà da travaglià più veloce di Javascript per a ragione ovvia - ùn hè micca bisognu di analizà.
IN: – Questu hè sempre un puntu cuntruversu... Ùn ci hè ancu nisuna implementazione di riferimentu di "Vasma" (Assemblea Web) per pudè ghjudicà senza ambiguità. Conceptually, sì: tutti capiscenu chì u binariu deve esse più veloce, ma l'implementazione attuale di u stessu V8 hè assai efficace.
AG: - Iè.
IN: - A compilazione ci travaglia veramente assai cool è ùn hè micca un fattu chì ci sarà un grande vantaghju.
AG: - Web Assembly hè ancu fattu da i grandi.
IN: – Mi pari chì hè sempre difficiule à ghjudicà Web Assembly. Ci sò stati cunversazioni dapoi parechji anni, ma ci sò pochi rializazioni veri chì si ponu sente.
AG: - Forse. Videremu.
IN: – Ùn avemu micca prublemi in u backend... Forse duvemu lascià sti prublemi in u frontend ? Perchè andà ci?
AG: - Avemu da mantene un staffu di travagliadori in prima linea.
Certi annunzii 🙂
Grazie per stà cun noi. Ti piace i nostri articuli ? Vulete vede più cuntenutu interessante? Supportaci facendu un ordine o ricumandendu à l'amichi,
Dell R730xd 2 volte più prezzu in u centru di dati Equinix Tier IV in Amsterdam? Solu quì
Source: www.habr.com