{"id":71628,"date":"2020-02-27T08:51:24","date_gmt":"2020-02-27T05:51:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/aleksej-grachyov-go-frontend"},"modified":"2020-03-03T16:14:16","modified_gmt":"2020-03-03T13:14:16","slug":"aleksej-grachyov-go-frontend","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Aleksei Gra\u010dev: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Meetup-ul Go din Kiev, mai 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Moderator:<\/b> \u2013 Bun\u0103 ziua tuturor! V\u0103 mul\u021bumesc c\u0103 sunte\u021bi aici! Ast\u0103zi avem doi vorbitori oficiali \u2013 Alex \u0219i Vania. Vor mai fi \u00eenc\u0103 doi, dac\u0103 avem timp. Primul vorbitor este Alexey Grachev, care ne va vorbi despre GopherJS.<\/p>\n<p><b>Alexey Grachev (din acest moment \u2013 AG):<\/b> \u2013 Eu sunt dezvoltator Go \u0219i scriu servicii web \u00een Go. Uneori trebuie s\u0103 m\u0103 ocup de frontend, uneori trebuie s\u0103 intervin manual acolo. Vreau s\u0103 v\u0103 \u00eemp\u0103rt\u0103\u0219esc experien\u021ba \u0219i cercet\u0103rile mele despre Go \u00een frontend.<\/p>\n<p>Legenda este c\u0103 mai \u00eent\u00e2i vom discuta despre de ce vrem s\u0103 rul\u0103m Go \u00een frontend, apoi vom discuta despre cum se poate face acest lucru. Exist\u0103 dou\u0103 c\u0103i \u2013 Web Assembly \u0219i GopherJS. S\u0103 vedem \u00een ce stare sunt aceste solu\u021bii \u0219i ce putem face.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Ce nu este \u00een regul\u0103 cu frontend-ul?<\/h3>\n<p>\nToat\u0103 lumea este de acord c\u0103 totul este bine cu frontend-ul?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/065119e699053306072b1d7aa3183b34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNu sunt suficiente teste? Compilare lent\u0103? Ecologie? Bine.<\/p>\n<p>\u00cen leg\u0103tur\u0103 cu frontend-ul, \u00eemi place o citat spus de unul dintre dezvoltatorii frontend \u00een cartea sa:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e69eba4fc073c0b59789859c94ba29f2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen Javascript nu exist\u0103 un sistem de tipuri. Acum voi numi problemele cu care m-am confruntat \u00een timpul muncii \u0219i voi explica cum sunt rezolvate.<\/p>\n<p>Este greu de numit un sistem de tipuri \u00een Javascript \u2013 exist\u0103 \u0219iruri de caractere care reprezint\u0103 tipul unui obiect, dar de fapt nu au leg\u0103tur\u0103 cu tipurile. Aceast\u0103 problem\u0103 a fost rezolvat\u0103 \u00een TypeScript (un suprastructur\u0103 pe l\u00e2ng\u0103 Javascript) \u0219i Flow (un static-checker de tipuri \u00een Javascript). Practic, frontend-ul a ajuns deja la solu\u021bia problemei sistemului de tipuri slab \u00een Javascript.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/257542cbfd2e316fbe0a0033056fff6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNu exist\u0103 o bibliotec\u0103 standard \u00een browser, a\u0219a cum exist\u0103 \u00een mod obi\u0219nuit \u2013 exist\u0103 c\u00e2teva obiecte \u00eencorporate \u0219i func\u021bii \u201emagice\u201d \u00een browsere. Dar \u00een Javascript, biblioteca standard lipse\u0219te. Aceast\u0103 problem\u0103 a fost c\u00e2ndva rezolvat\u0103 de jQuery (toat\u0103 lumea folosea jQuery cu toate prototipurile, helper-urile, func\u021biile necesare pentru a func\u021biona). Acum, toat\u0103 lumea folose\u0219te Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4eae8a8f19776028bd88fe8f7a751605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCallback hell. Cred c\u0103 toat\u0103 lumea a v\u0103zut cod Javascript acum aproximativ 5 ani, iar acesta ar\u0103ta ca o \u201et\u0103v\u0103lug\u201d dintr-o re\u021bea incredibil\u0103 de callback-uri. Acum, aceast\u0103 problem\u0103 a fost rezolvat\u0103 (odat\u0103 cu lansarea ES-15 sau ES-16), au fost ad\u0103ugate promisiuni (promises) \u00een Javascript \u0219i tuturor le-a fost mai u\u0219or pentru o vreme.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e2n\u0103 nu a venit Promice hell... Nu \u0219tiu cum reu\u0219e\u0219te industria frontend, dar tot timpul se bag\u0103 \u00een ni\u0219te situa\u021bii ciudate. Au reu\u0219it s\u0103 fac\u0103 hell \u0219i cu \u201epromisiunile\u201d. Apoi au rezolvat aceast\u0103 problem\u0103, ad\u0103ug\u00e2nd un nou primitiv \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblema cu asynchronicitatea este rezolvat\u0103. Async\/await este un primitiv destul de popular \u00een diferite limbaje. \u00cen Python \u0219i \u00een altele exist\u0103 o astfel de abordare \u2013 este destul de bun\u0103. Problema este solu\u021bionat\u0103.<\/p>\n<p>Ce problem\u0103 nu este rezolvat\u0103? Complexitatea ecosistemului \u0219i a framework-urilor, care cre\u0219te exponen\u021bial, precum \u0219i programarea \u00een sine.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Sintaxa Javascript este pu\u021bin ciudat\u0103. Cu to\u021bii \u0219tim de problemele cu adunarea unui array \u0219i a unui obiect \u0219i alte capcane.<\/li>\n<li>Javascript este multiparadigmatic. Acum este un sistem mai ales necesar, deoarece ecosistemul este foarte mare:\n<ul>\n<li>toat\u0103 lumea scrie \u00een stiluri diferite \u2013 unii scriu \u00een mod structural, al\u021bii func\u021bional, diferi\u021bi dezvoltatori scriu diferit;<\/li>\n<li>din diferite pachete (packages) vin paradigme diferite, c\u00e2nd folose\u0219ti diferite pachete;<\/li>\n<li>exist\u0103 foarte mult\u0103 \u00abdistrac\u021bie\u00bb cu programarea func\u021bional\u0103 \u00een Javascript \u2013 a ap\u0103rut biblioteca ramda \u0219i acum nimeni nu poate citi programele scrise \u00een aceast\u0103 bibliotec\u0103.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Toate acestea aduc un impact major asupra ecosistemului, care a crescut incredibil. Pachetele nu sunt compatibile \u00eentre ele: unii folosesc promisiuni, al\u021bii async\/await, al\u021bii callback-uri. Totodat\u0103, se scrie \u00een diferite paradigme!<\/li>\n<li>Aceasta duce la dificult\u0103\u021bi \u00een men\u021binerea proiectului. E greu s\u0103 g\u0103se\u0219ti un bug dac\u0103 nu po\u021bi citi codul.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Ce este Web Assembly?<\/h3>\n<p>\nEchipa de la Mozilla Foundation \u0219i alte companii au venit cu ceva numit Web Assembly. Ce este asta?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Este o ma\u0219in\u0103 virtual\u0103 \u00eencorporat\u0103 \u00een browser care suport\u0103 un format binar.<\/li>\n<li>Programele binare sunt introduce aici \u0219i se execut\u0103 aproape nativ, adic\u0103 browserul nu trebuie s\u0103 parcurg\u0103 tot codul javascript de fiecare dat\u0103.<\/li>\n<li>Toate browserele au declarat suport pentru aceasta.<\/li>\n<li>Deoarece este byte-code, po\u021bi scrie un compilator pentru orice limbaj.<\/li>\n<li>Cele patru browsere principale sunt deja livrate cu suport pentru Web Assembly.<\/li>\n<li>\u00cen cur\u00e2nd a\u0219tept\u0103m suport nativ \u00een Go. O astfel de nou\u0103 arhitectur\u0103 s-a ad\u0103ugat deja: GOARCH=wasm GOOS=js (\u00een cur\u00e2nd). P\u00e2n\u0103 acum, a\u0219a cum \u00een\u021beleg eu, nu este func\u021bional\u0103, dar exist\u0103 o declara\u021bie c\u0103 aceasta va fi cu siguran\u021b\u0103 disponibil\u0103 \u00een Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Ce trebuie s\u0103 facem acum? GopherJS<\/h3>\n<p>\nP\u00e2n\u0103 c\u00e2nd nu avem suport pentru Web Assembly, exist\u0103 un transpiler numit GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Codul Go este transpilat \u00een Javascript \u00abcurat\u00bb.<\/li>\n<li>Se ruleaz\u0103 \u00een toate browserele \u2013 nu con\u021bine func\u021bii noi care sunt suportate doar de browsere moderne (acesta este Vanilla JS, care se ruleaz\u0103 pe orice fel de platform\u0103).<\/li>\n<li>Exist\u0103 suport pentru aproape tot ce este \u00een Go, inclusiv goroutine \u0219i canale\u2026 \u2013 tot ce iubim \u0219i \u0219tim.<\/li>\n<li>Practically \u00eentreaga bibliotec\u0103 standard este suportat\u0103, cu excep\u021bia pachetelor pentru care nu are sens s\u0103 fie suportate \u00een browser: syscall, interac\u021biuni de re\u021bea (exist\u0103 client net\/http, dar nu \u0219i server, iar clientul este emulat prin XMLHttpRequest). \u00cen general, \u00eentreaga bibliotec\u0103 standard este disponibil\u0103 \u2013 iat\u0103-o \u00een browser, iat\u0103 stdlib Go, pe care o iubim.<\/li>\n<li>\u00centreaga ecosistem de pachete \u00een Go, toate solu\u021biile ter\u021be (\u0219abloane etc.) pot fi compilate folosind GopherJS \u0219i rulate \u00een browser.<\/li>\n<\/ul>\n<p>\nOb\u021binerea GopherJS este foarte simpl\u0103 \u2013 este un pachet Go obi\u0219nuit. Facem go get, \u0219i avem comanda GopherJS pentru a construi aplica\u021bia:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIat\u0103 un mic hello world\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026Un program Go obi\u0219nuit, un pachet fmt din biblioteca standard \u0219i Binding Js, pentru a accesa API-ul browserului. Println se va transforma \u00een console log, iar browserul va scrie \u201cHello gophers\u201d! A\u0219a de simplu: facem GopherJS build \u2013 \u00eel lans\u0103m \u00een browser \u2013 totul func\u021bioneaz\u0103!<\/p>\n<h3>Ce avem p\u00e2n\u0103 acum? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nExist\u0103 bindings pentru toate framework-urile js populare:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js pentru crearea de grafice \u0219i lucrul cu seturi mari de date;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>chiar exist\u0103 suport pentru Electron (deci deja putem scrie aplica\u021bii desktop pe \u00abElectron\u00bb);<\/li>\n<li>\u0219i cel mai amuzant \u2013 este WebGL (putem face aplica\u021bii poligonale, inclusiv jocuri cu grafic\u0103 3D, muzic\u0103 \u0219i toate op\u021biunile);<\/li>\n<li>\u0219i foarte multe alte bindings pentru toate framework-urile \u0219i bibliotecile javascript populare.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Framework<\/h3>\n<p><\/p>\n<ol>\n<li>Exist\u0103 deja un framework web dezvoltat special pentru GopherJS \u2013 Vecty. Este un echivalent complet al React.js, dar dezvoltat pe Go, cu specificarea GopherJS.<\/li>\n<li>Exist\u0103 saci de jocuri (surpriz\u0103!). Am g\u0103sit dou\u0103 dintre cele mai populare:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nVoi demonstra c\u00e2teva exemple, cum arat\u0103 \u0219i ce poate fi deja scris pe Go:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSau o astfel de variant\u0103 (nu am g\u0103sit un shooter 3D, dar poate exist\u0103):<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Ce propun?<\/h3>\n<p>\nIndustria frontend-ului se afl\u0103 acum \u00eentr-o stare astfel \u00eenc\u00e2t toate limbile care anterior s-au pl\u00e2ns de Javascript vor veni acum. Acum toate vor fi compileaz\u0103 \u00een \u201eWeb Assembly\u201d. Ce ne trebuie pentru a ocupa un loc demn acolo ca \u201egofers\u201d?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen Go, este o tradi\u021bie c\u0103 acesta este un limbaj de programare de sistem, iar practic nu exist\u0103 biblioteci pentru a lucra cu UI. Exist\u0103 c\u00e2teva, dar sunt pe jum\u0103tate abandonate, pe jum\u0103tate nefunc\u021bionale.<\/p>\n<p>\u0218i iat\u0103 \u2013 o oportunitate bun\u0103 de a crea biblioteci UI \u00een Go, care vor rula pe GopherJS! \u00cen sf\u00e2r\u0219it, po\u021bi scrie propriul t\u0103u framework! A venit acea vreme c\u00e2nd po\u021bi scrie un framework, \u0219i va fi unul dintre primele care va primi adaptare timpurie, iar tu vei fi o stea (dac\u0103 este un framework bun).<\/p>\n<p>Po\u021bi adapta o mul\u021bime de pachete diferite, care exist\u0103 deja \u00een ecosistemul Go, la specificul browser-ului (de exemplu, motor de template). Ele vor func\u021biona deja; po\u021bi face \u00eenveliri convenabile pentru a putea reda con\u021binutul direct \u00een browser. \u00cen plus, po\u021bi crea, de exemplu, un serviciu capabil s\u0103 redea acela\u0219i lucru pe server \u0219i pe front-end, folosind acela\u0219i cod \u2013 exact cum \u00eei place dezvoltatorilor front-end (doar c\u0103 acum \u00een Go).<\/p>\n<p>Po\u021bi scrie un joc! Doar pentru distrac\u021bie\u2026<\/p>\n<p>Asta e tot.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Gra\u010dev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00centreb\u0103ri<\/h3>\n<p>\n<b>\u00centrebare (\u00een continuare \u2013 \u00ce):<\/b> \u2013 Scriu \u00een Go sau \u00een Js?<\/p>\n<p><b>AG:<\/b> \u2013 Scrii \u00een Go rutine, canale, structuri, embedding \u2013 tot... Te abonezi la eveniment, transmi\u021bi o func\u021bie acolo.<\/p>\n<p><b>M:<\/b> \u2013 Deci, scriu \u00een \u00abgol\u00bb Js?<\/p>\n<p><b>AG:<\/b> \u2013 Nu, scrii cumva \u00een Go \u0219i te conectezi la API-ul browser-ului (API-ul nu s-a schimbat). Po\u021bi scrie propriile tale \u00eenveliri, astfel \u00eenc\u00e2t mesajele s\u0103 ajung\u0103 \u00een canal \u2013 nu e greu.<\/p>\n<p><b>M:<\/b> \u2013 Ce zici de mobil?<\/p>\n<p><b>AG:<\/b> \u2013 Am v\u0103zut clar: exist\u0103 binding-uri pentru patch-ul Cordova, care sunt rulate de Js. \u00cen React Native \u2013 nu \u0219tiu; poate exist\u0103, poate nu (nu m-am interesat prea mult). Motorul de joc N-go suport\u0103 aplica\u021bii mobile \u2013 at\u00e2t iOs, c\u00e2t \u0219i Android.<\/p>\n<p><b>M:<\/b> \u2013 \u00centrebare despre Web Assembly. Spa\u021biul ocupat cre\u0219te tot mai mult, \u00een ciuda comprim\u0103rii, \u201ezip-erii\u201d... Nu vom distruge astfel lumea front-end-ului \u0219i mai mult?<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly este un format binar, iar binarul prin default nu poate fi mai mare \u00een versiunea final\u0103 dec\u00e2t textul... Te atrage runtime-ul, dar este acela\u0219i lucru cu a trage biblioteca standard Javascript c\u00e2nd nu este, de aceea folosim ceva de genul Lodash. Nu \u0219tiu c\u00e2t ocup\u0103 Lodash.<\/p>\n<p><b>M:<\/b> \u2013 Cu siguran\u021b\u0103 mai pu\u021bin dec\u00e2t runtime-ul...<\/p>\n<p><b>AG:<\/b> \u2013 Pe Javascript \u00abcurat\u00bb?<\/p>\n<p><b>M:<\/b> \u2013 Da. \u00cel comprim\u0103m \u00eenainte de a-l trimite...<\/p>\n<p><b>AG:<\/b> \u2013 Dar acesta este un text\u2026 \u00cen general, un megabyte pare mult, dar este totul (ai tot runtime-ul). Apoi, scrii logica ta de afaceri, care va cre\u0219te binary-ul cu 1%. P\u00e2n\u0103 acum nu v\u0103d cum asta ar afecta frontend-ul. \u00cen plus, Web Assembly va func\u021biona mai repede dec\u00e2t Javascript din motive evidente \u2013 nu trebuie s\u0103 fie parsat\u0103.<\/p>\n<p><b>M:<\/b> \u2013 Este un punct de discu\u021bie\u2026 Nu exist\u0103 \u00eenc\u0103 o implementare de referin\u021b\u0103 a \u201eVasm\u0103\u201d (Web Assembly) pentru a putea judeca \u00een mod clar. Conceptual \u2013 da: to\u021bi \u00een\u021belegem c\u0103 binary-ul ar trebui s\u0103 fie mai rapid, dar implementarea actual\u0103 a lui V8 este foarte eficient\u0103.<\/p>\n<p><b>AG:<\/b> \u2013 Da.<\/p>\n<p><b>M:<\/b> \u2013 Compilarea acolo func\u021bioneaz\u0103 \u00eentr-adev\u0103r foarte bine \u0219i nu este garantat c\u0103 va exista un mare avantaj.<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly este dezvoltat \u0219i de mari companii.<\/p>\n<p><b>M:<\/b> \u2013 P\u00e2n\u0103 acum, mi se pare c\u0103 este \u00eenc\u0103 greu de judecat Web Assembly. Au trecut c\u00e2\u021biva ani de discu\u021bii, dar realiz\u0103rile reale pe care le putem testa sunt pu\u021bine.<\/p>\n<p><b>AG:<\/b> \u2013 Poate. Vom vedea.<\/p>\n<p><b>M:<\/b> \u2013 Nu avem probleme pe backend\u2026 Poate ar trebui s\u0103 l\u0103s\u0103m aceste probleme pe frontend? De ce s\u0103 intervenim acolo?<\/p>\n<p><b>AG:<\/b> \u2013 Trebuie s\u0103 avem un personal de frontend.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"xF2xUKIk2MQ\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/xF2xUKIk2MQ\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h3>Pu\u021bin publicitate \ud83d\ude42<\/h3>\n<p>\nMul\u021bumim c\u0103 r\u0103m\u00e2ne\u021bi cu noi. V\u0103 plac articolele noastre? Dori\u021bi s\u0103 vede\u021bi mai multe materiale interesante? Sus\u021bine\u021bi-ne, efectu\u00e2nd o comand\u0103 sau recomand\u00e2ndu-ne prietenilor, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud pentru dezvoltatori de la 4,99 $<\/a><\/noindex>, <b>un echivalent unic pentru serverele entry-level, care a fost creat de noi pentru voi:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Toat\u0103 adev\u0103rul despre VPS (KVM) E5-2697 v3 (6 nuclee) 10GB DDR4 480GB SSD 1Gbps de la 19 $ sau cum s\u0103 \u00eemp\u0103r\u021bi\u021bi corect un server?<\/a><\/noindex> (sunt disponibile op\u021biuni cu RAID1 \u0219i RAID10, p\u00e2n\u0103 la 24 nuclee \u0219i p\u00e2n\u0103 la 40GB DDR4).<\/p>\n<p><b>Dell R730xd la jum\u0103tate de pre\u021b \u00een centrul de date Equinix Tier IV din Amsterdam?<\/b> Numai la noi <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB de la 199 $<\/a><\/noindex> \u00een Olanda! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 de la 99 $!<\/b><\/b> Citi\u021bi despre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Cum s\u0103 construi\u021bi o infrastructur\u0103 de clas\u0103 enterprise folosind servere Dell R730xd E5-2650 v4 la pre\u021buri foarte mici de 9000 \u20ac?<\/a><\/noindex><br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/489636\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0432\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043f\u0438\u043a\u0435\u0440\u0430 \u2013 \u041b\u0451\u0448\u0430 \u0438 \u0412\u0430\u043d\u044f. \u0411\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u0434\u0432\u0430, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0445\u0432\u0430\u0442\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u043a\u0435\u0440 \u2013 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432, \u043e\u043d \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043e GopherJS. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u0413): \u2013 \u042f \u2013 Go-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440, \u0438 \u044f \u043f\u0438\u0448\u0443 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71629,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71628","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432: Go Frontend | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-27T05:51:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Alexey Gra\u010dev: Go Frontend | ProHoster","description":"Kyiv Go Meetup Mai 2018: Moderator: \u2013 Bun\u0103 ziua tuturor.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432: Go Frontend | ProHoster","og:description":"Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-27T05:51:24+00:00","article:modified_time":"2020-03-03T13:14:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71628","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:58:26","updated":"2022-09-27 20:58:26","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}