Alexey Grachev: Go Frontend

Kyiv Go Meetup Mai 2018:

Alexey Grachev: Go Frontend

Moderator: – Hallo zusammen! Vielen Dank, dass Sie hier sind! Heute haben wir zwei offizielle Redner – Alex und Ivan. Wenn wir Zeit haben, gibt es noch zwei weitere. Unser erster Redner ist Alexey Grachev, der uns ĂŒber GopherJS berichten wird.

Alexey Grachev (im Folgenden – AG): – Ich bin Go-Entwickler und schreibe Webservices in Go. Manchmal muss ich mich mit dem Frontend befassen und da selbst Hand anlegen. Ich möchte Ihnen von meinen Erfahrungen und Untersuchungen zur Nutzung von Go im Frontend berichten.

Die Legende ist folgende: Zuerst sprechen wir darĂŒber, warum wir Go im Frontend einsetzen möchten, danach erlĂ€utern wir, wie das möglich ist. Es gibt zwei Wege – Web Assembly und GopherJS. Wir schauen uns an, in welchem Zustand sich diese Lösungen befinden und was man damit tun kann.

Was stimmt nicht mit dem Frontend?

Sind wir uns alle einig, dass alles gut mit dem Frontend ist?

Alexey Grachev: Go Frontend

Wenig Tests? Langsame Builds? Ökosystem? Gut.

Was das Frontend betrifft, gefÀllt mir ein Zitat von einem der Frontend-Entwickler in seinem Buch:

Alexey Grachev: Go Frontend

In Javascript gibt es kein Typsystem. Jetzt werde ich die Probleme benennen, mit denen ich im Laufe meiner Arbeit konfrontiert war, und erklÀren, wie man sie löst.

Das Typsystem kann man in JavaScript eigentlich nicht als solches bezeichnen – es gibt Strings, die den Typ eines Objekts anzeigen, aber tatsĂ€chlich haben sie mit Typen nichts zu tun. Dieses Problem wurde in TypeScript (eine Erweiterung von JavaScript) und Flow (einem statischen TypprĂŒfer fĂŒr JavaScript) gelöst. TatsĂ€chlich hat das Frontend die Probleme mit dem mangelhaften Typsystem in JavaScript mittlerweile angegangen.

Alexey Grachev: Go Frontend

Eine Standardbibliothek im Browser gibt es nicht wirklich – es existieren einige eingebaute Objekte und "magische" Funktionen in den Browsern. Aber in Javascript als solches fehlt eine Standardbibliothek. Dieses Problem wurde frĂŒher durch jQuery gelöst (jeder verwendete jQuery mit allen Prototypen, Helpern und Funktionen, die fĂŒr die Arbeit notwendig sind). Heute verwendet man stattdessen Lodash:

Alexey Grachev: Go Frontend

Callback-Hölle. Ich denke, jeder hat vor etwa 5 Jahren JavaScript-Code gesehen, der wie ein "Nudelgericht" aus einem unglaublichen Durcheinander von Callback-Funktionen aussah. Diese Problematik wurde jetzt mit der EinfĂŒhrung von ES-15 oder ES-16 gelöst, da Promises zu JavaScript hinzugefĂŒgt wurden, was allen fĂŒr eine gewisse Zeit das Leben erleichtert hat.

Alexey Grachev: Go Frontend

Bis jetzt hat Promice hell noch nicht erreicht... Ich weiß nicht, wie es die Frontend-Industrie schafft, aber sie geraten stĂ€ndig in merkwĂŒrdige AbgrĂŒnde. Sie haben es sogar bei "Promises" geschafft, die Hölle zu erschaffen. Dann haben sie beschlossen, dieses Problem zu lösen, indem sie einen neuen Primitivtyp – async/await – hinzugefĂŒgt haben:

Alexey Grachev: Go Frontend

Mit AsynchronitĂ€t ist das Problem gelöst. Async/await ist ein recht populĂ€rer Primitivtyp in verschiedenen Sprachen. In Python und anderen gibt es einen solchen Ansatz – er funktioniert ziemlich gut. Das Problem ist gelöst.

Welches Problem bleibt ungelöst? Die geometrisch wachsende KomplexitĂ€t von Frameworks, die KomplexitĂ€t des Ökosystems und der Software selbst.

Alexey Grachev: Go Frontend

  • Die Syntax von JavaScript ist etwas eigenartig. Wir alle kennen die Probleme beim ZusammenfĂŒgen von Arrays und Objekten sowie andere KuriositĂ€ten.
  • JavaScript ist multiparadigmatisch. Dies ist jetzt besonders relevant, da das Ökosystem sehr groß ist:
    • alle schreiben in unterschiedlichen Stilen – manche schreiben strukturell, andere funktional, verschiedene Entwickler schreiben unterschiedlich;
    • aus verschiedenen Paketen resultieren unterschiedliche Paradigmen, wenn Sie verschiedene Pakete verwenden;
    • Es gibt eine Menge an „Spaß“ mit funktionaler Programmierung in JavaScript – es ist eine Bibliothek namens Rambda erschienen und jetzt kann niemand mehr Programme lesen, die mit dieser Bibliothek geschrieben wurden.

  • Das hat einen großen Einfluss auf das Ökosystem und es hat sich unglaublich weiterentwickelt. Die Pakete sind untereinander inkompatibel: manche basieren auf Promises, andere auf async/await, manche wiederum auf Callbacks. Und sie werden sogar in verschiedenen Paradigmen geschrieben!
  • Das fĂŒhrt dazu, dass das Projekt schwer zu pflegen ist. Es ist schwierig, einen Bug zu finden, wenn du den Code nicht lesen kannst.

Was ist Web Assembly?

Die tollen Leute von der Mozilla Foundation und mehreren anderen Unternehmen haben etwas erfunden, das Web Assembly genannt wird. Was ist das?

Alexey Grachev: Go Frontend

  • Es handelt sich um eine im Browser integrierte virtuelle Maschine, die ein binĂ€res Format unterstĂŒtzt.
  • Binares Programm wird dort ausgefĂŒhrt, praktisch nativ, das heißt, der Browser muss nicht jedes Mal den gesamten „Nudeln“-JavaScript-Code parsen.
  • Alle Browser haben ihre UnterstĂŒtzung angekĂŒndigt.
  • Da dies Bytecode ist, kann man einen Compiler fĂŒr jede Sprache schreiben.
  • Die vier großen Browser sind bereits mit UnterstĂŒtzung fĂŒr Web Assembly ausgestattet.
  • Bald erwarten wir nativ UnterstĂŒtzung in Go. Diese neue Architektur ist bereits hinzugefĂŒgt: GOARCH=wasm GOOS=js (bald). Soweit ich verstehe, ist sie aktuell nicht funktionsfĂ€hig, aber es gibt eine Aussage, dass dies definitiv in Go kommen wird.

Was kann ich jetzt tun? GopherJS

Aktuell haben wir keine UnterstĂŒtzung fĂŒr Web Assembly, aber es gibt einen Transpiler namens GopherJS.

Alexey Grachev: Go Frontend

  • Code in Go wird in „reines“ Javascript transpiliert.
  • Es lĂ€uft in allen Browsern – es gibt keine neuen Funktionen, die nur von modernen Browsern unterstĂŒtzt werden (das ist Vanilla JS, das ĂŒberall lĂ€uft).
  • So gut wie alles, was in Go vorhanden ist, wird unterstĂŒtzt, einschließlich Goroutinen und KanĂ€len
 – alles, was wir so lieben und kennen.
  • Fast die gesamte Standardbibliothek wird unterstĂŒtzt, mit Ausnahme der Pakete, die im Browser keinen Sinn machen: syscall, net-Interaktionen (es gibt einen net/http-Client, aber keinen Server, und der Client wird ĂŒber XMLHttpRequest emuliert). Im Allgemeinen ist die gesamte Standardbibliothek verfĂŒgbar – hier ist sie im Browser, hier ist die stdlib Go, die wir lieben.
  • Das gesamte Ökosystem von Go-Paketen, alle Drittanbieterlösungen (Templating usw.) können mit GopherJS kompiliert und im Browser ausgefĂŒhrt werden.

Es ist ganz einfach, GopherJS zu erhalten – es handelt sich um ein gewöhnliches Go-Paket. Machen Sie ein ‚go get‘, und Sie haben das GopherJS-Tool, um Ihre Anwendung zu kompilieren:

Alexey Grachev: Go Frontend

Hier ist ein kleines Hello World...

Alexey Grachev: Go Frontend

...Eine normale Go-Anwendung, ein ganz gewöhnliches fmt-Paket aus der Standardbibliothek und die Binding-Tools, um auf die Browser-API zuzugreifen. Das Println wird schließlich in ein Console Log umgewandelt, und der Browser zeigt „Hello gophers“ an! So einfach: Wir machen GopherJS build – starten im Browser – und alles funktioniert!

Was gibt es bisher? Bindings

Alexey Grachev: Go Frontend

Es gibt Bindings fĂŒr alle gĂ€ngigen JS-Frameworks:

  • JQuery;
  • Angular.js;
  • D3.js fĂŒr Diagramme und die Arbeit mit großen Datenmengen;
  • React.js;
  • VueJS;
  • es gibt sogar UnterstĂŒtzung fĂŒr Electron (das bedeutet, dass wir bereits jetzt Desktop-Anwendungen mit ‚Electron‘ entwickeln können);
  • und das Lustigste – es ist WebGL (wir können photorealistische Anwendungen erstellen, einschließlich Spiele mit 3D-Grafik, Musik und allen anderen Extras);
  • und viele weitere Bindings fĂŒr alle gĂ€ngigen JavaScript-Frameworks und -Bibliotheken.

Framework

  1. Es gibt bereits ein speziell fĂŒr GopherJS entwickeltes Web-Framework – Vecty. Es ist ein vollstĂ€ndiges Äquivalent zu React.js, jedoch auf Go basierend, mit den spezifischen Eigenschaften von GopherJS.
  2. Es gibt sogar SpielesĂ€cke (ĂŒberraschend!). Ich habe die zwei populĂ€rsten gefunden:
    • Engo;
    • Ebiten.

Ich möchte Ihnen ein paar Beispiele zeigen, wie das aussieht und was man bereits jetzt in Go schreiben kann:

Alexey Grachev: Go Frontend

Oder eine andere Variante (ich habe keinen 3D-Shooter gefunden, aber vielleicht gibt es ihn):

Alexey Grachev: Go Frontend

Was schlage ich vor?

Die Frontend-Industrie befindet sich derzeit in einem Zustand, in dem alle Programmiersprachen, die zuvor ĂŒber Javascript geklagt haben, nun auf den Markt drĂ€ngen. Jetzt werden alle in „WebAssembly“ kompiliert. Was brauchen wir, um dort einen angemessenen Platz als „Gopher“ einzunehmen?

Alexey Grachev: Go Frontend

Es hat sich traditionell gezeigt, dass Go eine Systemprogrammiersprache ist und es praktisch keine Bibliotheken fĂŒr die Arbeit mit UI gibt. Es gibt einige, aber sie sind zur HĂ€lfte veraltet und zur HĂ€lfte nicht funktional.

Und jetzt – eine hervorragende Gelegenheit, UI-Bibliotheken in Go zu entwickeln, die auf GopherJS ausgefĂŒhrt werden! Endlich kann man sein eigenes Framework schreiben! Es ist die Zeit gekommen, ein Framework zu entwickeln, das eines der ersten sein wird, sich frĂŒh anpassen wird und Sie zur BerĂŒhmtheit machen kann (wenn es ein gutes Framework ist).

Es lassen sich zahlreiche verschiedene Pakete, die bereits im Go-Ökosystem verfĂŒgbar sind, an die Besonderheiten des Browsers anpassen (zum Beispiel Template-Engine). Sie funktionieren bereits, zudem kann man nĂŒtzliche Wrapper erstellen, um Inhalte direkt im Browser einfach zu rendern. Außerdem lĂ€sst sich beispielsweise ein Service erstellen, der dasselbe sowohl auf dem Server als auch im Frontend rendert, und dabei denselben Code verwendet – genau so, wie es Frontend-Entwickler mögen (nun eben auf Go).

Man könnte ein Spiel schreiben! Just for fun


Das war's von meiner Seite.

Alexey Grachev: Go Frontend

Fragen

Frage (im Folgenden – F): – Schreibe ich in Go oder in Js?

AG: – Du schreibst in Go-Routinen, KanĂ€len, Strukturen, Embedding – alles... Du abonnierst ein Event, ĂŒbergibst eine Funktion.

Frage: – Das heißt, ich schreibe quasi in „reinem“ Js?

AG: – Nein, du schreibst gewissermaßen in Go und greifst auf die Browser-API zu (die API hat sich dabei nicht verĂ€ndert). Du kannst deine eigenen Wrapper schreiben, damit Nachrichten in den Kanal gelangen – das ist ja nicht kompliziert.

Frage: – Wie sieht es mit MobilgerĂ€ten aus?

AG: – Ich habe auf jeden Fall gesehen, dass es Bindings fĂŒr das Cordova-Patch gibt, das Js ausfĂŒhrt. Bei React Native – ich weiß nicht; vielleicht gibt es welche, vielleicht nicht (darum habe ich mich nicht wirklich gekĂŒmmert). Die Game-Engine N-go unterstĂŒtzt auch mobile Anwendungen – sowohl iOS als auch Android.

Frage: – Frage zu Web Assembly. Immer mehr Platz wird beansprucht, trotz der Komprimierung, der "Zip-Datei"... Töten wir dadurch die Welt des Frontends nicht noch mehr?

AG: – Web Assembly ist ein binĂ€res Format, und binĂ€r kann per Default in der endgĂŒltigen Version nicht mehr sein als Text
 Ihr strebt nach Runtime, aber das ist dasselbe, wie eine Standard-Javascript-Bibliothek anzuziehen, wenn sie nicht vorhanden ist, deshalb verwenden wir etwas wie Lodash. Ich weiß nicht, wie viel Lodash benötigt.

Frage: – Offensichtlich weniger als Runtime...

AG: – Auf "purem" Javascript?

Frage: – Ja. Wir komprimieren es, bevor wir es senden...

AG: – Aber das ist doch Text... Im Allgemeinen ist ein Megabyte viel, aber das ist alles (du hast deine gesamte Runtime). Dann schreibst du deine Business-Logik, die deinen Binary um 1 % erhöht. Bisher sehe ich nicht, dass es das Frontend ruiniert. Außerdem wird Web Assembly schneller arbeiten als Javascript aus einem offensichtlichen Grund – es muss nicht geparst werden.

Frage: – Das ist derzeit ein strittiger Punkt... Es gibt noch keine definitive Implementierung von "Wasm" (Web Assembly), um ein eindeutiges Urteil abgeben zu können. Konzeptuell – ja: Wir alle verstehen, dass binĂ€r schneller sein sollte, aber die aktuelle Implementierung von V8 ist sehr effizient.

AG: – Ja.

Frage: – Die Kompilierung funktioniert wirklich großartig dort, und es ist nicht sicher, dass es einen großen Vorteil geben wird.

AG: – Auch große Unternehmen nutzen Web Assembly.

Frage: – Im Moment scheint es mir noch schwierig zu sein, Web Assembly zu beurteilen. Es gibt schon seit Jahren Diskussionen, aber die tatsĂ€chlichen greifbaren Erfolge sind eher spĂ€rlich.

AG: – Vielleicht. Wir werden sehen.

Frage: – Wir haben keine Probleme im Backend... Vielleicht sollten wir diese Probleme im Frontend belassen? Warum dort eingreifen?

AG: – Man muss ein Team von Frontend-Entwicklern halten.

Video abspielen

Ein wenig Werbung 🙂

Danke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? Möchten Sie mehr interessante Inhalte sehen? UnterstĂŒtzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Ihren Freunden empfehlen. Cloud-VPS fĂŒr Entwickler ab 4,99 $, eine einzigartige Alternative zu Einsteiger-Servern, die wir fĂŒr Sie entwickelt haben: Alles ĂŒber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt? (VerfĂŒgbar sind Optionen mit RAID1 und RAID10, bis zu 24 Kerne und bis zu 40GB DDR4).

Dell R730xd im Equinix Tier IV Rechenzentrum in Amsterdam zum halben Preis? Nur bei uns 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB ab 199 $ in den Niederlanden! Dell R420 — 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — ab 99 $! Lesen Sie darĂŒber Wie man eine Unternehmenskosten-Infrastruktur mit Dell R730xd E5-2650 v4-Servern fĂŒr ein paar Euro aufbaut?

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster