Alexey Grachev: Go Frontend

Kyiv Go Meetup Mai 2018:

Alexey Grachev: Go Frontend

Moderator: – Hallo zusammen! Vielen Dank, dass ihr hier seid! Heute haben wir zwei offizielle Sprecher – Alexej und Wanja. Es werden noch zwei weitere sprechen, wenn wir genug Zeit haben. Der erste Sprecher ist Alexej Gratschjow, der uns ĂŒber GopherJS erzĂ€hlen wird.

Alexej Gratschjow (im Folgenden – AG): – Ich bin Go-Entwickler und schreibe Web-Services in Go. Manchmal komme ich mit dem Frontend in BerĂŒhrung, manchmal muss ich da handgreiflich eingreifen. Ich möchte ĂŒber meine Erfahrungen und Forschungen zu Go im Frontend berichten.

Die Legende ist folgende: Zuerst sprechen wir darĂŒber, warum wir Go im Frontend ausfĂŒhren möchten, dann besprechen wir, wie dies möglich ist. Es gibt zwei Wege – Web Assembly und GopherJS. Wir werden uns ansehen, in welchem Zustand sich diese Lösungen befinden und was man damit machen kann.

Was ist falsch am Frontend?

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

Alexey Grachev: Go Frontend

Zu wenig Tests? Lange Build-Zeiten? Ö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 wÀhrend meiner Arbeit konfrontiert war, und erklÀren, wie sie gelöst werden.

Ein Typsystem kann man in Javascript kaum als solches bezeichnen – es gibt Strings, die den Typ eines Objekts darstellen, aber das hat tatsĂ€chlich nichts mit Typen zu tun. Dieses Problem wird in TypeScript (einer Erweiterung von Javascript) und Flow (einem statischen Typ-PrĂŒfer in Javascript) gelöst. TatsĂ€chlich hat das Frontend bereits das Problem eines schlechten Typsystems in Javascript gelöst.

Alexey Grachev: Go Frontend

Eine Standardbibliothek gibt es im Browser nicht wirklich – es gibt einige eingebaute Objekte und „magische“ Funktionen in den Browsern. Aber in Javascript als solchem fehlt eine Standardbibliothek. Dieses Problem wurde einmal von jQuery gelöst (alle verwendeten jQuery mit all seinen Prototypen, Helfern und Funktionen, die fĂŒr die Arbeit benötigt werden). Heute verwendet jeder Lodash:

Alexey Grachev: Go Frontend

Callback-Hölle. Ich denke, jeder hat vor etwa 5 Jahren Javascript-Code gesehen, der wie „Nudeln“ aus einem unglaublichen Gewirr von Callbacks aussah. Dieses Problem wurde jetzt gelöst (mit der EinfĂŒhrung von ES-15 oder ES-16), es wurden Promises in Javascript hinzugefĂŒgt und alle konnten fĂŒr eine Zeit wieder leichter atmen.

Alexey Grachev: Go Frontend

Bis die Promises-Hölle kam
 Ich weiß nicht, wie die Frontend-Industrie es schafft, aber sie treiben sich stĂ€ndig in seltsame AbgrĂŒnde. Sie haben sogar in den „Promises“ eine Hölle geschafft. SpĂ€ter wurde dieses Problem gelöst, indem ein neuer Primitiv hinzugefĂŒgt wurde – async/await:

Alexey Grachev: Go Frontend

Mit der AsynchronitÀt ist das Problem gelöst. Async/await ist ein ziemlich beliebtes Konzept in verschiedenen Programmiersprachen. In Python und anderen Sprachen wird dieser Ansatz verwendet - er ist ziemlich gut. Das Problem ist gelöst.

Welches Problem ist ungelöst? Die exponentiell steigende KomplexitĂ€t von Frameworks, die Schwierigkeit des Ökosystems und der eigentlichen Programme.

Alexey Grachev: Go Frontend

  • Die Syntax von Javascript ist etwas seltsam. Wir alle kennen die Schwierigkeiten beim ZusammenfĂŒgen von Arrays und Objekten und andere Besonderheiten.
  • Javascript ist multiparadigmatisch. Genau jetzt ist es ein besonders relevantes System, wenn das Ökosystem sehr groß ist:
    • alle schreiben in verschiedenen Stilen – die einen schreiben strukturiert, die anderen funktional, verschiedene Entwickler schreiben unterschiedlich;
    • aus verschiedenen Paketen kommen unterschiedliche Paradigmen, wenn Sie verschiedene Pakete verwenden;
    • es gibt sehr viel ‚Spaß‘ mit funktionaler Programmierung in Javascript – es ist eine Bibliothek namens rambda erschienen und jetzt kann niemand mehr die in dieser Bibliothek geschriebenen Programme lesen.

  • Das alles hat einen großen Einfluss auf das Ökosystem, und es ist unglaublich gewachsen. Pakete sind untereinander inkompatibel: einige basieren auf Promises, andere auf async/await, wieder andere auf Callbacks. Außerdem wird auch in verschiedenen Paradigmen geschrieben!
  • Das fĂŒhrt dazu, dass das Projekt schwer zu warten ist. Es ist schwierig, einen Bug zu finden, wenn Sie den Code nicht lesen können.

Was ist Web Assembly?

Die talentierten Leute von der Mozilla Foundation und mehreren anderen Unternehmen haben so etwas wie Web Assembly erfunden. Was ist das?

Alexey Grachev: Go Frontend

  • Es ist eine im Browser integrierte virtuelle Maschine, die ein binĂ€res Format unterstĂŒtzt.
  • Binarprogramme werden dort ausgefĂŒhrt, praktisch nativ, das heißt, der Browser muss nicht jedes Mal den gesamten ‚Satz‘ von Javascript-Code parsen.
  • Alle Browser haben UnterstĂŒtzung zugesagt.
  • Da es Bytecode ist, kann man einen Compiler fĂŒr jede Sprache schreiben.
  • Die vier Hauptbrowser bieten bereits UnterstĂŒtzung fĂŒr Web Assembly.
  • Bald erwarten wir native UnterstĂŒtzung in Go. Eine solche neue Architektur ist bereits hinzugefĂŒgt worden: GOARCH=wasm GOOS=js (bald). Soweit ich verstehe, ist sie derzeit nicht funktional, jedoch gibt es eine ErklĂ€rung, dass es auf jeden Fall in Go kommen wird.

Was ist jetzt zu tun? GopherJS

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

Alexey Grachev: Go Frontend

  • Go-Code 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 in allem lĂ€uft, was auch immer).
  • Es gibt UnterstĂŒtzung fĂŒr fast alles, was in Go vorhanden ist, einschließlich Goroutinen und KanĂ€len 
 – alles, was wir so lieben und kennen.
  • Fast die gesamte Standardbibliothek wird unterstĂŒtzt, mit Ausnahme der Pakete, deren UnterstĂŒtzung im Browser keinen Sinn macht: syscall, net-Interaktionen (es gibt einen net/http-Client, aber keinen Server, und der Client wird ĂŒber XMLHttpRequest emuliert). Insgesamt ist die gesamte Standardbibliothek verfĂŒgbar – hier ist sie im Browser, hier ist die stdlib Go, die wir lieben.
  • Das gesamte Paket-Ökosystem in Go, alle Drittanbieter-Lösungen (Template-Engines usw.) können mit GopherJS kompiliert und im Browser ausgefĂŒhrt werden.

GopherJS zu bekommen ist ganz einfach – es ist ein normales Go-Paket. Wir machen go get, und wir haben den Befehl GopherJS, um die Anwendung zu bauen:

Alexey Grachev: Go Frontend

So ein kleines Hello World


Alexey Grachev: Go Frontend


Eine gewöhnliche Go-Anwendung, ein gewöhnliches fmt-Paket der Standardbibliothek und Binding Js, um auf die API des Browsers zuzugreifen. Println wird schließlich in ein Console Log umgewandelt und der Browser wird „Hello gophers!“ ausgeben! So einfach: wir machen GopherJS build – starten im Browser – alles funktioniert!

Was ist derzeit verfĂŒgbar? Bindings

Alexey Grachev: Go Frontend

Es gibt Bindings fĂŒr alle beliebten JS-Frameworks:

  • JQuery;
  • Angular.js;
  • D3.js fĂŒr Diagramme und die Arbeit mit großen Daten;
  • React.js;
  • VueJS;
  • es gibt sogar UnterstĂŒtzung fĂŒr Electron (d.h. wir können bereits jetzt Desktop-Anwendungen mit „Electron“ schreiben);
  • und das Beste – es ist WebGL (wir können vollgrafische Anwendungen erstellen, einschließlich Spielen mit 3D-Grafik, Musik und allen VorzĂŒgen);
  • und sehr viele andere Bindings fĂŒr alle beliebten JavaScript-Frameworks und -Bibliotheken.

Framework

  1. Es gibt bereits ein speziell fĂŒr GopherJS entwickeltes Web-Framework – Vecty. Dies ist ein vollwertiger Analogon zu React.js, jedoch auf Go entwickelt, mit der Spezifik GopherJS.
  2. Es gibt sogar Spiel-Engines (ĂŒberraschenderweise!). Ich habe zwei der beliebtesten gefunden:
    • Engo;
    • Ebiten.

Ich werde ein paar Beispiele zeigen, wie das aussieht und was man bereits jetzt in Go schreiben kann:

Alexey Grachev: Go Frontend

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

Alexey Grachev: Go Frontend

Was schlage ich vor?

Aktuell befindet sich die Frontend-Industrie in einem Zustand, wo alle Sprachen, die zuvor ĂŒber JavaScript geklagt haben, dort einströmen werden. Jetzt werden alle in „WebAssembly“ kompiliert. Was brauchen wir, um dort als „Gopher“ einen angemessenen Platz einzunehmen?

Alexey Grachev: Go Frontend

In Go geht man traditionell davon aus, dass es sich um eine Systemprogrammiersprache handelt, und es gibt praktisch keine Bibliotheken fĂŒr die Arbeit mit der BenutzeroberflĂ€che. Es gibt etwas, aber es ist halb aufgegeben, halb nicht funktional.

Und hier ist eine gute Gelegenheit, UI-Bibliotheken in Go zu erstellen, die auf GopherJS basieren! Man kann endlich sein eigenes Framework schreiben! Die Zeit ist gekommen, ein Framework zu entwickeln, und es wird eines der ersten sein und frĂŒhe Anpassung erhalten, und Sie werden zum Star (wenn es ein gutes Framework wird).

Man kann eine Vielzahl unterschiedlicher Pakete, die bereits im Go-Ökosystem vorhanden sind, an die spezifische Browserumgebung anpassen (zum Beispiel Template-Engines). Diese funktionieren bereits, man kann praktische Wrapper erstellen, um Inhalte direkt im Browser einfach zu rendern. Außerdem kann man beispielsweise einen Service entwickeln, der dasselbe sowohl auf dem Server als auch im Frontend rendert, indem er denselben Code verwendet – ganz so, wie es Frontend-Entwickler gerne haben (aber jetzt in Go).

Man kann ein Spiel schreiben! Nur zum Spaß...

Das ist alles 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Ă€le, Strukturen, Embedding – alles... Du abonnierst ein Ereignis und ĂŒbergibst eine Funktion.

Frage: – Also schreibe ich in „purem“ Js?

AG: – Nein, du schreibst gewissermaßen in Go und verbindest dich mit der API des Browsers (die API hat sich dabei nicht geĂ€ndert). Du kannst deine eigenen Wrapper schreiben, damit Nachrichten in den Kanal kommen – das ist nicht schwer.

Frage: – Was ist mit MobilgerĂ€ten?

AG: – Ich habe definitiv gesehen: Es gibt Bindungen fĂŒr das Cordova-Patch, das Js ausfĂŒhrt. Bei React Native weiß ich nicht; vielleicht gibt es sie, vielleicht nicht (ich habe mich nicht besonders dafĂŒr interessiert). Die Spiel-Engine N-go unterstĂŒtzt auch mobile Anwendungen – sowohl iOS als auch Android.

Frage: – Frage zu Web Assembly. Der Speicherbedarf wĂ€chst, trotz der Komprimierung, der „Zip-Datei“... Werden wir dadurch die Frontend-Welt nicht noch mehr schĂ€digen?

AG: – Web Assembly ist ein binĂ€res Format, und binĂ€r kann standardmĂ€ĂŸig in der endgĂŒltigen Version nicht grĂ¶ĂŸer sein als Text... Du meinst das Runtime-Problem, aber das ist dasselbe, wie wenn du die Standardbibliothek von Javascript einbindest, wenn sie nicht vorhanden ist, weshalb wir irgendein Lodash verwenden. Ich weiß nicht, wie viel Lodash benötigt.

Frage: – Deutlich weniger als das Runtime...

AG: – In „purem“ Javascript?

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

AG: – Aber das ist doch ein Text
 Im Allgemeinen sind Megabyte relativ viel, aber das ist alles (du hast deine gesamte Laufzeit). Dann schreibst du deine GeschĂ€ftslogik, die dein Binary um 1 % vergrĂ¶ĂŸert. Bisher sehe ich nicht, dass dies das Frontend beeintrĂ€chtigt. Zumal Web Assembly schneller arbeiten wird als Javascript, aus dem offensichtlichen Grund – es muss nicht geparst werden.

Frage: – Ein noch strittiger Punkt
 Es gibt noch keine definitive Implementierung von „Wasma“ (Web Assembly), um eindeutig urteilen zu können. Konzeptuell – ja: Wir alle verstehen, dass das Binary schneller sein sollte, aber die aktuelle Implementierung von V8 ist sehr effizient.

AG: – Ja.

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

AG: – Web Assembly wird auch von großen Unternehmen entwickelt.

Frage: – Im Moment erscheint es mir noch schwierig, ĂŒber Web Assembly zu urteilen. Seit Jahren wird darĂŒber gesprochen, aber es gibt nur wenige reale Fortschritte, die man anfassen kann.

AG: – Möglicherweise. Wir werden sehen.

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

AG: – Wir mĂŒssen ein Team von Frontend-Entwicklern beschĂ€ftigen.

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 Freunden empfehlen, Cloud-VPS fĂŒr Entwickler ab 4,99 $, ein einzigartiges Äquivalent zu Einsteigerservern, das wir fĂŒr Sie entwickelt haben: Die ganze Wahrheit ĂŒber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt? (es sind Optionen mit RAID1 und RAID10 bis zu 24 Kernen und bis zu 40GB DDR4 verfĂŒgbar).

Dell R730xd ist im Equinix Tier IV Rechenzentrum in Amsterdam doppelt so gĂŒnstig? 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, wie man eine Unternehmensinfrastruktur der Klasse C mit Dell R730xd E5-2650 v4-Servern fĂŒr 9000 Euro im Preis-Leistungs-VerhĂ€ltnis aufbaut?

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster