{"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\/pl\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Aleksiej Graczew: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Meetup Go w Kijowie, maj 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Prowadz\u0105cy:<\/b> \u2013 Cze\u015b\u0107 wszystkim! Dzi\u0119kuj\u0119, \u017ce si\u0119 zebrali\u015bcie! Dzi\u015b mamy dw\u00f3ch oficjalnych prelegent\u00f3w \u2013 Ljosza i Wani\u0119. B\u0119dzie jeszcze dw\u00f3ch, je\u015bli czas nam na to pozwoli. Pierwszy prelegent to Aleksiej Graczow, kt\u00f3ry opowie o GopherJS.<\/p>\n<p><b>Aleksiej Graczow (dalej \u2013 AG):<\/b> \u2013 Jestem programist\u0105 Go i pisz\u0119 us\u0142ugi internetowe w Go. Czasem musz\u0119 zmierzy\u0107 si\u0119 z front-endem, czasem wkracza\u0142em tam r\u0119kami. Chc\u0119 opowiedzie\u0107 o swoim do\u015bwiadczeniu i badaniach Go na froncie.<\/p>\n<p>Legenda jest taka: najpierw porozmawiamy, dlaczego chcemy uruchomi\u0107 Go na frontendzie, a potem om\u00f3wimy, jak to mo\u017cna zrobi\u0107. S\u0105 dwie drogi \u2013 Web Assembly i GopherJS. Zobaczymy, w jakim stanie znajduj\u0105 si\u0119 te rozwi\u0105zania i co mo\u017cna z nimi zrobi\u0107.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Co jest nie tak z frontendem?<\/h3>\n<p>\nWszyscy si\u0119 zgadzaj\u0105, \u017ce z front-endem wszystko jest w porz\u0105dku?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/065119e699053306072b1d7aa3183b34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMa\u0142o test\u00f3w? Wolna kompilacja? Ekosystem? Dobrze.<\/p>\n<p>Je\u015bli chodzi o front-end, podoba mi si\u0119 cytat jednego z deweloper\u00f3w front-endowych w jego ksi\u0105\u017cce:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e69eba4fc073c0b59789859c94ba29f2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW JavaScript nie ma systemu typ\u00f3w. Teraz wymieni\u0119 problemy, z kt\u00f3rymi si\u0119 zmaga\u0142em w trakcie swojej pracy, oraz wyja\u015bni\u0119, jak je rozwi\u0105zano.<\/p>\n<p>System typ\u00f3w w JavaScript w\u0142a\u015bciwie trudno nazwa\u0107 systemem typ\u00f3w \u2013 s\u0105 tam \u0142a\u0144cuchy, kt\u00f3re oznaczaj\u0105 typ obiektu, ale tak naprawd\u0119 nie maj\u0105 z typami nic wsp\u00f3lnego. Ten problem zosta\u0142 rozwi\u0105zany w TypeScript (rozszerzenie JavaScript) i Flow (statyczny checker typ\u00f3w w JavaScript). W\u0142a\u015bciwie front-end ju\u017c dawno dotar\u0142 do rozwi\u0105zania problemu s\u0142abego systemu typ\u00f3w w JavaScript.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/257542cbfd2e316fbe0a0033056fff6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nStandardowej biblioteki w przegl\u0105darkach w\u0142a\u015bciwie nie ma \u2013 s\u0105 jakie\u015b wbudowane obiekty i \u00abmagiczne\u00bb funkcje w przegl\u0105darkach. Ale w JavaScript jako takowego standardowej biblioteki brak. Ten problem ju\u017c raz rozwi\u0105zano w jQuery (wszyscy u\u017cywali jQuery ze wszystkimi prototypami, helperami, funkcjami, kt\u00f3re s\u0105 potrzebne do pracy). Teraz wszyscy u\u017cywaj\u0105 Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4eae8a8f19776028bd88fe8f7a751605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCallback hell. My\u015bl\u0119, \u017ce wszyscy widzieli kod w JavaScript oko\u0142o 5 lat temu, kt\u00f3ry wygl\u0105da\u0142 jak \u00abmakaron\u00bb z niewiarygodnie skomplikowanym spl\u0105taniem callback\u00f3w. Teraz ten problem zosta\u0142 rozwi\u0105zany (z wydaniem ES-15 lub ES-16), dodano do JavaScript obietnice (promises) i wszystkim na chwil\u0119 sta\u0142o si\u0119 \u0142atwiej.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDop\u00f3ki nie pojawi\u0142 si\u0119 Promice hell\u2026 Nie wiem, jak przemys\u0142 front-endowy to robi, ale wci\u0105\u017c zap\u0119dzaj\u0105 si\u0119 w jakie\u015b dziwne zakamarki. Uda\u0142o im si\u0119 r\u00f3wnie\u017c zrobi\u0107 hell z \u00abpromis\u00f3w\u00bb. Potem postanowili rozwi\u0105za\u0107 ten problem, dodaj\u0105c nowy prymityw \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblem z asynchroniczno\u015bci\u0105 zosta\u0142a rozwi\u0105zana. Async\/await to do\u015b\u0107 popularny mechanizm w r\u00f3\u017cnych j\u0119zykach. W Pythonie i w innych j\u0119zykach istnieje takie podej\u015bcie \u2013 jest ono wystarczaj\u0105co dobre. Problem zosta\u0142 rozwi\u0105zany.<\/p>\n<p>Jaka problem nie zosta\u0142 rozwi\u0105zany? Rosn\u0105ca w geometrycznej progresji z\u0142o\u017cono\u015b\u0107 framework\u00f3w, z\u0142o\u017cono\u015b\u0107 ekosystemu i samego oprogramowania.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Sk\u0142adnia JavaScript jest nieco dziwna. Wszyscy znamy problemy z dodawaniem tablic i obiekt\u00f3w oraz inne ciekawe sytuacje.<\/li>\n<li>JavaScript to j\u0119zyk wieloparadygmatowy. Obecnie jest to szczeg\u00f3lnie istotny system, gdy ekosystem jest bardzo du\u017cy:\n<ul>\n<li>wszyscy pisz\u0105 w r\u00f3\u017cnych stylach \u2013 niekt\u00f3rzy pisz\u0105 strukturowo, inni funkcjonalnie, r\u00f3\u017cni deweloperzy pisz\u0105 na r\u00f3\u017cne sposoby;<\/li>\n<li>z r\u00f3\u017cnych pakiet\u00f3w (packages) pochodzi r\u00f3\u017cne paradygmaty, gdy u\u017cywasz r\u00f3\u017cnych pakiet\u00f3w;<\/li>\n<li>jest bardzo du\u017co \"zabawy\" z programowaniem funkcyjnym w JavaScript \u2013 pojawi\u0142a si\u0119 biblioteka Ramda i teraz nikt nie potrafi czyta\u0107 program\u00f3w napisanych w tej bibliotece.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>To wszystko wnosi ogromny wp\u0142yw na ekosystem, kt\u00f3ry rozr\u00f3s\u0142 si\u0119 w niewiarygodny spos\u00f3b. Pakiety nie s\u0105 ze sob\u0105 kompatybilne: niekt\u00f3rzy u\u017cywaj\u0105 obietnic, inni \u2013 async\/await, jeszcze inni \u2013 callback\u00f3w. I pisz\u0105 w r\u00f3\u017cnych paradygmatach!<\/li>\n<li>To prowadzi do tego, \u017ce projekt jest trudny do utrzymania. Trudno znale\u017a\u0107 b\u0142\u0105d, je\u015bli nie mo\u017cesz przeczyta\u0107 kodu.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Czym jest Web Assembly?<\/h3>\n<p>\nDzielni ch\u0142opcy z Mozilla Foundation i kilku innych firm wymy\u015blili co\u015b takiego jak Web Assembly. Czym to jest?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>To wbudowana w przegl\u0105dark\u0119 maszyna wirtualna, kt\u00f3ra obs\u0142uguje format binarny.<\/li>\n<li>Programy binarne trafiaj\u0105 tam, s\u0105 wykonywane praktycznie natywnie, co oznacza, \u017ce przegl\u0105darka nie musi za ka\u017cdym razem analizowa\u0107 ca\u0142ego \"spaghetti\" kodu JavaScript.<\/li>\n<li>Wszystkie przegl\u0105darki og\u0142osi\u0142y wsparcie.<\/li>\n<li>Poniewa\u017c to jest kod bajtowy, mo\u017cna napisa\u0107 kompilator do dowolnego j\u0119zyka.<\/li>\n<li>Cztery g\u0142\u00f3wne przegl\u0105darki ju\u017c dostarczaj\u0105 wsparcie dla Web Assembly.<\/li>\n<li>Wkr\u00f3tce oczekujemy natywnego wsparcia w Go. Taka nowa architektura ju\u017c zosta\u0142a dodana: GOARCH=wasm GOOS=js (wkr\u00f3tce). Na razie, jak rozumiem, nie jest to funkcjonalne, jednak istnieje zapowied\u017a, \u017ce na pewno b\u0119dzie to w Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Co teraz robi\u0107? GopherJS<\/h3>\n<p>\nP\u00f3ki nie mamy wsparcia dla Web Assembly, istnieje taki transpiler jak GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Kod w Go jest transpilanowany do \"czystego\" JavaScript.<\/li>\n<li>Uruchamia si\u0119 we wszystkich przegl\u0105darkach \u2013 nie ma tam nowych funkcji, kt\u00f3re s\u0105 obs\u0142ugiwane tylko przez nowoczesne przegl\u0105darki (to Vanilla JS, kt\u00f3ry dzia\u0142a na wszystkim).<\/li>\n<li>Obs\u0142ugiwane jest prawie wszystko, co jest w Go, w tym goroutines i kana\u0142y\u2026 \u2013 wszystko, co tak uwielbiamy i znamy.<\/li>\n<li>Prawie ca\u0142a standardowa biblioteka jest wspierana, z wyj\u0105tkiem tych pakiet\u00f3w, kt\u00f3re nie maj\u0105 sensu wspiera\u0107 w przegl\u0105darce: syscall, interakcje sieciowe (jest klient net\/http, ale nie ma serwera, a klient jest emulowany przez XMLHttpRequest). Generalnie ca\u0142a standardowa biblioteka jest dost\u0119pna \u2013 oto ona w przegl\u0105darce, oto stdlib Go, kt\u00f3r\u0105 kochamy.<\/li>\n<li>Ca\u0142a ekosystem pakietu w Go, wszystkie zewn\u0119trzne rozwi\u0105zania (szablony itp.) mo\u017cna skompilowa\u0107 za pomoc\u0105 GopherJS i uruchomi\u0107 w przegl\u0105darce.<\/li>\n<\/ul>\n<p>\nZainstalowanie GopherJS jest bardzo \u0142atwe \u2013 to zwyk\u0142y pakiet Go. Wykonujemy go get, a mamy komend\u0119 GopherJS, aby zbudowa\u0107 aplikacj\u0119:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOto taki ma\u0142y hello world\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026Zwyk\u0142y program Go, zwyk\u0142y pakiet fmt standardowej biblioteki oraz Binding Js, aby uzyska\u0107 dost\u0119p do interfejsu API przegl\u0105darki. Println w rezultacie zostanie przekszta\u0142cone w console log, a przegl\u0105darka wy\u015bwietli \u201eHello gophers\u201d! Tak prosto: wykonujemy GopherJS build \u2013 uruchamiamy w przegl\u0105darce \u2013 wszystko dzia\u0142a!<\/p>\n<h3>Co jest obecnie dost\u0119pne? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u0105 bindy do wszystkich popularnych framework\u00f3w js:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js do tworzenia wykres\u00f3w i pracy z du\u017cymi danymi;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>nawet jest wsparcie dla Electron (wi\u0119c ju\u017c teraz mo\u017cemy pisa\u0107 aplikacje desktopowe na 'Electron');<\/li>\n<li>i co najdziwniejsze \u2013 to WebGL (mo\u017cemy tworzy\u0107 aplikacje p\u00f3\u0142wymiarowe, w tym gry z grafik\u0105 3D, muzyk\u0105 i wszystkimi bajerami);<\/li>\n<li>i naprawd\u0119 wiele innych bind\u00f3w do wszystkich popularnych framework\u00f3w i bibliotek javascript.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Framework<\/h3>\n<p><\/p>\n<ol>\n<li>Istnieje ju\u017c opracowany specjalnie dla GopherJS framework webowy \u2013 Vecty. To pe\u0142noprawny odpowiednik React.js, ale zaprojektowany na Go, z specyfik\u0105 GopherJS.<\/li>\n<li>S\u0105 te\u017c silniki gier (niespodziewanie!). Znalaz\u0142em dwa najpopularniejsze:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nPoka\u017c\u0119 par\u0119 przyk\u0142ad\u00f3w, jak to wygl\u0105da i co ju\u017c teraz mo\u017cna napisa\u0107 w Go:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLub taka wersja (3D-shooter nie znalaz\u0142em, ale by\u0107 mo\u017ce istnieje):<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Co proponuj\u0119?<\/h3>\n<p>\nObecnie przemys\u0142 frontendu znajduje si\u0119 w takim stanie, \u017ce wszystkie j\u0119zyki, kt\u00f3re do tej pory cierpia\u0142y z powodu JavaScriptu, rzuc\u0105 si\u0119 w t\u0119 stron\u0119. Teraz wszystkie b\u0119d\u0105 kompilowa\u0107 si\u0119 do 'Web Assembly'. Co potrzebujemy, aby zaj\u0105\u0107 tam godne miejsce jako 'gophers'?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW Go tradycyjnie postrzega si\u0119 jako j\u0119zyk programowania systemowego i praktycznie nie istniej\u0105 biblioteki do pracy z interfejsem u\u017cytkownika. Co\u015b tam jest, ale jest to cz\u0119\u015bciowo porzucone i cz\u0119\u015bciowo niefunkcjonalne.<\/p>\n<p>I oto \u2013 \u015bwietna okazja, aby stworzy\u0107 biblioteki UI w Go, kt\u00f3re b\u0119d\u0105 dzia\u0142a\u0142y na GopherJS! Mo\u017cna wreszcie napisa\u0107 w\u0142asny framework! Nadszed\u0142 czas, aby stworzy\u0107 framework, kt\u00f3ry b\u0119dzie jednym z pierwszych i zdob\u0119dzie wczesn\u0105 adaptacj\u0119, a Ty staniesz si\u0119 gwiazd\u0105 (je\u015bli to b\u0119dzie dobry framework).<\/p>\n<p>Mo\u017cna zaadoptowa\u0107 mn\u00f3stwo r\u00f3\u017cnych pakiet\u00f3w, kt\u00f3re ju\u017c istniej\u0105 w ekosystemie Go, do specyfiki przegl\u0105darki (na przyk\u0142ad silnika szablon\u00f3w). One i tak ju\u017c dzia\u0142aj\u0105, mo\u017cna stworzy\u0107 wygodne opakowania, aby mo\u017cna by\u0142o \u0142atwo renderowa\u0107 tre\u015bci bezpo\u015brednio w przegl\u0105darce. Dodatkowo mo\u017cna stworzy\u0107 na przyk\u0142ad serwis, kt\u00f3ry potrafi renderowa\u0107 to samo na serwerze i na frontendzie, u\u017cywaj\u0105c tego samego kodu \u2013 wszystko zgodnie z tym, co lubi\u0105 deweloperzy frontendowi (tylko teraz w Go).<\/p>\n<p>Mo\u017cna napisa\u0107 gr\u0119! Just for fun\u2026<\/p>\n<p>To wszystko z mojej strony.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksiej Graczew: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Pytania<\/h3>\n<p>\n<b>Pytanie (dalej \u2013 P):<\/b> \u2013 Pisz\u0119 w Go czy w Js?<\/p>\n<p><b>AG:<\/b> \u2013 Piszesz w Go \u2013 rutyny, kana\u0142y, struktury, osadzanie \u2013 wszystko... Zapisujesz si\u0119 na event, przekazujesz tam funkcj\u0119.<\/p>\n<p><b>P:<\/b> \u2013 Czyli pisz\u0119 w 'czystym' Js?<\/p>\n<p><b>AG:<\/b> \u2013 Nie, piszesz jakby w Go i \u0142\u0105czysz si\u0119 z API przegl\u0105darki (API si\u0119 nie zmieni\u0142o). Mo\u017cesz napisa\u0107 swoje opakowania, aby wiadomo\u015bci trafia\u0142y do kana\u0142u \u2013 to nie jest trudne.<\/p>\n<p><b>P:<\/b> \u2013 A co z mobilnymi aplikacjami?<\/p>\n<p><b>AG:<\/b> \u2013 Na pewno widzia\u0142em: s\u0105 bindy dla patcha Cordova, kt\u00f3ry uruchamia Js. W React Native \u2013 nie wiem; mo\u017ce s\u0105, a mo\u017ce nie (nie interesowa\u0142em si\u0119 tym zbytnio). Silnik gier N-go obs\u0142uguje tak\u017ce aplikacje mobilne \u2013 zar\u00f3wno iOS, jak i Android.<\/p>\n<p><b>P:<\/b> \u2013 Pytanie dotycz\u0105ce Web Assembly. Zajmuje coraz wi\u0119cej miejsca, mimo kompresji, \u201ezipowania\u201d... Czy w ten spos\u00f3b nie zrujnujemy jeszcze bardziej \u015bwiata frontendowego?<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly to format binarny i z definicji nie mo\u017ce by\u0107 wi\u0119kszy w finalnym wydaniu od tekstu... Ci\u0105gnie Ci\u0119 do runtime, ale to to samo, co \u015bci\u0105gni\u0119cie standardowej biblioteki Javascript, gdy jej nie ma, dlatego u\u017cywamy czego\u015b takiego jak Lodash. Nie wiem, ile zajmuje Lodash.<\/p>\n<p><b>P:<\/b> \u2013 Zdecydowanie mniej ni\u017c runtime\u2026<\/p>\n<p><b>AG:<\/b> \u2013 Na 'czystym' Javascript?<\/p>\n<p><b>P:<\/b> \u2013 Tak. Przecie\u017c go kompresujemy przed wys\u0142aniem...<\/p>\n<p><b>AG:<\/b> \u2013 Ale to jest tekst\u2026 Og\u00f3lnie rzecz bior\u0105c, megabajt to jakby du\u017co, ale to wszystko (masz ca\u0142y runtime). Nast\u0119pnie piszesz swoj\u0105 logik\u0119 biznesow\u0105, kt\u00f3ra zwi\u0119kszy tw\u00f3j binary o 1%. Na razie nie widz\u0119, \u017ceby to zabi\u0142o frontend. Zw\u0142aszcza, \u017ce Web Assembly b\u0119dzie dzia\u0142a\u0107 szybciej ni\u017c Javascript z oczywistego powodu \u2013 nie trzeba go analizowa\u0107.<\/p>\n<p><b>P:<\/b> \u2013 To wci\u0105\u017c kontrowersyjny temat\u2026 Nie ma jeszcze jakiej\u015b wzorcowej implementacji \u201eWasma\u201d (Web Assembly), \u017ceby mo\u017cna by\u0142o jednoznacznie to oceni\u0107. Koncepcyjnie \u2013 tak: wszyscy rozumiemy, \u017ce binary powinno by\u0107 szybsze, ale obecna implementacja V8 jest bardzo efektywna.<\/p>\n<p><b>AG:<\/b> \u2013 Tak.<\/p>\n<p><b>P:<\/b> \u2013 Kompilacja tam naprawd\u0119 dzia\u0142a bardzo dobrze i nie ma pewno\u015bci, \u017ce b\u0119dzie du\u017ca przewaga.<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly r\u00f3wnie\u017c robi\u0105 duzi gracze.<\/p>\n<p><b>P:<\/b> \u2013 Na razie, wydaje mi si\u0119, \u017ce trudno oceni\u0107 Web Assembly. Ju\u017c ile lat si\u0119 o tym rozmawia, a rzeczywistych osi\u0105gni\u0119\u0107, kt\u00f3re mo\u017cna dotkn\u0105\u0107, jest niewiele.<\/p>\n<p><b>AG:<\/b> \u2013 Mo\u017cliwe. B\u0119dziemy obserwowa\u0107.<\/p>\n<p><b>P:<\/b> \u2013 Nie mamy problem\u00f3w na backendzie\u2026 Mo\u017ce lepiej zostawi\u0107 te problemy na frontendzie? Po co tam w to wnika\u0107?<\/p>\n<p><b>AG:<\/b> \u2013 Musimy trzyma\u0107 zesp\u00f3\u0142 frontendowc\u00f3w.<\/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=\"Odtwarzaj wideo\" 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>Troch\u0119 reklamy \ud83d\ude42<\/h3>\n<p>\nDzi\u0119kujemy, \u017ce jeste\u015b z nami. Podobaj\u0105 Ci si\u0119 nasze artyku\u0142y? Chcesz zobaczy\u0107 wi\u0119cej interesuj\u0105cych materia\u0142\u00f3w? Wspieraj nas sk\u0142adaj\u0105c zam\u00f3wienie lub polecaj\u0105c nas znajomym, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">chmurowe VPS dla programist\u00f3w od 4,99 $<\/a><\/noindex>, <b>unikatowy odpowiednik serwer\u00f3w entry-level, kt\u00f3ry zosta\u0142 stworzony przez nas dla Ciebie:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Ca\u0142a prawda o VPS (KVM) E5-2697 v3 (6 rdzeni) 10GB DDR4 480GB SSD 1Gbps od 19 $ lub jak prawid\u0142owo podzieli\u0107 serwer?<\/a><\/noindex> (dost\u0119pne opcje z RAID1 i RAID10, do 24 rdzeni i do 40GB DDR4).<\/p>\n<p><b>Dell R730xd dwa razy ta\u0144szy w centrum danych Equinix Tier IV w Amsterdamie?<\/b> Tylko u nas <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 100TB od 199 dolar\u00f3w<\/a><\/noindex> w Holandii! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 od 99 dolar\u00f3w!<\/b><\/b> Czytaj o tym <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Jak zbudowa\u0107 infrastruktur\u0119 klasy korporacyjnej z zastosowaniem serwer\u00f3w Dell R730xd E5-2650 v4 kosztuj\u0105cych 9000 euro za grosze?<\/a><\/noindex><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Aleksiej Graczow: Go Frontend | ProHoster","description":"Kyiv Go Meetup May 2018: Prowadz\u0105cy: \u2013 Witam wszystkich.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}