© Liashko/Shutterstock.com
Entwickler Magazin
WebAssembly-Anwendungen in Go schreiben

Gopher ante Browser

Die Version 1.11 der Programmiersprache Go ist die erste stabile Version mit initialer Unterstützung für WebAssembly (Wasm). Eine gute Gelegenheit also, sich Go als Programmiersprache für Wasm-Anwendungen anzusehen.

Sebastian Holstein


Unsere erste Go/Wasm-Anwendung sollte auf der aktuellsten möglichen Sprachversion basieren. Um sicherzugehen, dass WebAssembly von der auf dem System installierten Go-Version unterstützt wird, sollte man zunächst mit folgendem Kommando überprüfen, dass Go mindestens in der Version 1.11 installiert ist: go version.

JavaScript Runtime

Um die Kommunikation zwischen Go und JavaScript herzustellen, müssen wir eine JavaScript-basierte Runtime hinzufügen. Go 1.11 hat eine Implementierung an Bord, mit der wir JavaScript APIs aufrufen können. Die Implementierung kann im GOROOT-Verzeichnis gefunden werden, in meinem Fall war sie hier zu finden: / usr/local/opt/go/libexec/misc/wasm.

Alternativ kann man die benötigten Dateien auch im offiziellen Go Repository auf GitHub finden [1]. In diesem Verzeichnis ist neben der Runtime wasm_exec.js auch eine einfache HTML-Datei hinterlegt, die zeigt, wie die Wasm-Datei geladen und ausgeführt wird. Ich habe den Code ein wenig modifiziert und ES2015 Modules genutzt. Das Beispiel kann in meinem Repository auf GitHub gefunden werden [2].

main.go

Nachdem wir das HTML und die Runtime aufgesetzt haben, können wir unsere erste Go-Anwendung für den Browser schreiben (Listing 1).

Listing 1package main import (  "syscall/js"  "time") func main() {  js.Global().Get("console").Call("log", "Hello world Go/wasm!")  js.Global().Get("document").Call("getElementById", "app").Set("innerText", time.Now().String())}

Global() stellt den Kontext zur Verfügung, den man auch beim Schreiben einer gewöhnlichen JavaScript-Anwendung für den Browser erwarten würde. Man hat Zugriff auf sämtliche globale Variablen und kann Methoden aufrufen oder Attribute setzen. Wie man sieht: All diese Aktionen sind nicht typsicher. Um nun eine Wasm-Datei zu erstellen, muss das folgende Kommando ausgeführt werden: GOARCH=wasm GOOS=js go build -o app.wasm main.go.

Unterstützung für Wasm MIME Types auf Webservern

Was ich bemerkt habe, ist, dass viele Webserver nicht den MIME Type application/wasm unterstützen. Sollte der Webserver diesen MIME Type nicht senden, erlaubt der Browser die Ausführung der abgerufenen Datei. Man muss also in jedem Fall sicherstellen, dass der Webserver den MIME Type unterstützt. In meinem Beispiel nutze ich den fantastischen Caddy-Webserver (der ebenfalls auf Go basiert) und konfigurierte den MIME Type im Caddyfile (Listing 2).

Listing 2localhost mime {  .wasm application/wasm} gzip { ext *}

Beobachtungen

Hier möchte ich ein paar Beobachtungen teilen, die ich...

Entwickler Magazin
WebAssembly-Anwendungen in Go schreiben

Gopher ante Browser

Die Version 1.11 der Programmiersprache Go ist die erste stabile Version mit initialer Unterstützung für WebAssembly (Wasm). Eine gute Gelegenheit also, sich Go als Programmiersprache für Wasm-Anwendungen anzusehen.

Sebastian Holstein


Unsere erste Go/Wasm-Anwendung sollte auf der aktuellsten möglichen Sprachversion basieren. Um sicherzugehen, dass WebAssembly von der auf dem System installierten Go-Version unterstützt wird, sollte man zunächst mit folgendem Kommando überprüfen, dass Go mindestens in der Version 1.11 installiert ist: go version.

JavaScript Runtime

Um die Kommunikation zwischen Go und JavaScript herzustellen, müssen wir eine JavaScript-basierte Runtime hinzufügen. Go 1.11 hat eine Implementierung an Bord, mit der wir JavaScript APIs aufrufen können. Die Implementierung kann im GOROOT-Verzeichnis gefunden werden, in meinem Fall war sie hier zu finden: / usr/local/opt/go/libexec/misc/wasm.

Alternativ kann man die benötigten Dateien auch im offiziellen Go Repository auf GitHub finden [1]. In diesem Verzeichnis ist neben der Runtime wasm_exec.js auch eine einfache HTML-Datei hinterlegt, die zeigt, wie die Wasm-Datei geladen und ausgeführt wird. Ich habe den Code ein wenig modifiziert und ES2015 Modules genutzt. Das Beispiel kann in meinem Repository auf GitHub gefunden werden [2].

main.go

Nachdem wir das HTML und die Runtime aufgesetzt haben, können wir unsere erste Go-Anwendung für den Browser schreiben (Listing 1).

Listing 1package main import (  "syscall/js"  "time") func main() {  js.Global().Get("console").Call("log", "Hello world Go/wasm!")  js.Global().Get("document").Call("getElementById", "app").Set("innerText", time.Now().String())}

Global() stellt den Kontext zur Verfügung, den man auch beim Schreiben einer gewöhnlichen JavaScript-Anwendung für den Browser erwarten würde. Man hat Zugriff auf sämtliche globale Variablen und kann Methoden aufrufen oder Attribute setzen. Wie man sieht: All diese Aktionen sind nicht typsicher. Um nun eine Wasm-Datei zu erstellen, muss das folgende Kommando ausgeführt werden: GOARCH=wasm GOOS=js go build -o app.wasm main.go.

Unterstützung für Wasm MIME Types auf Webservern

Was ich bemerkt habe, ist, dass viele Webserver nicht den MIME Type application/wasm unterstützen. Sollte der Webserver diesen MIME Type nicht senden, erlaubt der Browser die Ausführung der abgerufenen Datei. Man muss also in jedem Fall sicherstellen, dass der Webserver den MIME Type unterstützt. In meinem Beispiel nutze ich den fantastischen Caddy-Webserver (der ebenfalls auf Go basiert) und konfigurierte den MIME Type im Caddyfile (Listing 2).

Listing 2localhost mime {  .wasm application/wasm} gzip { ext *}

Beobachtungen

Hier möchte ich ein paar Beobachtungen teilen, die ich...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang