GopherJSの紹介
By nobonobo
Javascriptを書きたくないでござる!な人向け。
GopherJSってなに?
Goの記述を100%Javascriptに変換してくれるツール。
GopherJSの特徴
- pure-GoなコードをJSの世界で動くように変換する。
- goroutineやchanも論理的に動作するように変換。
- 外部バイナリ(.soなど)への依存のある実装の変換はできません。
- CGOももちろんNG。
- オンメモリ操作のパッケージなどは100%動く。
- jsアーキテクチャとしてビルドされ、GOPATHを既存のものと共存可能。
- GoとGopherJS両対応のパッケージも増えてきた。
GopherJS対応ライブラリ
- honnef.co/go/js/dom
- github.com/goxjs/gl
- github.com/goxjs/glfw
- github.com/goxjs/websocket
- github.com/google/gxui
- github.com/gopherjs/eventsource
- github.com/gopherjs/jquery
- github.com/gopherjs/webgl
- github.com/gopherjs/websocket
- github.com/fabioberger/chrome
goxjs系はGoでもGopherJSでもビルド可能にしたライブラリ。 (+buildタグでjsや!jsで作り分けています)
GopherJSでできること。
アウトプットがピュアJavascriptなので、
- cordova
- electron(+Photonとか)
- chrome拡張
といった枠に載せちゃうことでいかなるフロントエンドも Goだけで書ける!!HTML5系アプリならなんでも作れるよ!!
- WindowsGUIアプリ
- MacGUIアプリ
- LinuxGUIアプリ
- iOSアプリ
- Androidアプリ
- Webアプリ
インストール
$ go get -u github.com/gopherjs/gopherjs
$ gopherjs
GopherJS is a tool for compiling Go source code to JavaScript.
Usage:
gopherjs [command]
Available Commands:
build compile packages and dependencies
get download and install packages and dependencies
install compile and install packages and dependencies
run compile and run Go program
test test packages
tool run specified go tool
serve compile on-the-fly and serve
Flags:
--color[=true]: colored output
-h, --help[=false]: help for gopherjs
-m, --minify[=false]: minify generated code
--tags="": a list of build tags to consider satisfied during the build
-v, --verbose[=false]: print the names of packages as they are compiled
-w, --watch[=false]: watch for changes to the source files
Use "gopherjs [command] --help" for more information about a command.
以下のサブコマンドはgoと極力同じ動作で実装されています。
- gopherjs build
- gopherjs get
- gopherjs install
- gopherjs run
- gopherjs test
- gopherjs tool
「gopherjs serve」はgopherjs専用で動作試験ができます。
サンプル
EventSourceを扱う例を挙げると以下のようなコードを・・・。
client.go
// +build js
package main
import (
"fmt"
"github.com/gopherjs/eventsource"
"github.com/gopherjs/gopherjs/js"
)
func main() {
es := eventsource.New("http://localhost:3000/sse")
es.AddEventListener("open", false, func(ev *js.Object) {
fmt.Println("open", ev)
})
es.AddEventListener("message", false, func(ev *js.Object) {
js.Global.Get("document").Call("writeln", ev.Get("data").String()+"<br/>")
})
es.AddEventListener("error", false, func(ev *js.Object) {
fmt.Println("error", ev)
})
}
以下のコマンドでビルドすると・・・。
gopherjs build client.go
以下の2つのファイルが生成されます。
- client.js
- client.js.map
おや?
Goのソースコードのままデバッグできる!?
.mapファイルのおかげでJSを見ないでも ブレークポイントセットしたりステップ実行できちゃうんですねー。
まとめ
なんとなくですが、AltJSなプロダクトをいろいろ触ってきましたが、 専用のものはよくできてるんでしょうけれど仕様の考え方はJSのまんまなのでツラかった。 高級言語をJS化するやつは既存のライブラリとオサラバする必要がありました。
このGopherJSの場合、
- 既存のJSライブラリを取り込んで利用するのは容易。
- 既存のGoライブラリを取り込んで利用するのも容易。
- 型厳格なのでコンパイル時に多くの問題を取り除ける。
- Goのテストの仕組みをそのまんま利用できる。
これ、下手なAltJSより有望なんじゃなかろうか。
おまけ
go get -u github.com/gopherjs/gopherjs
go get -u github.com/google/gxui/...
go get -u honnef.co/go/js/dom
gopherjs serve
以上の操作のあと、
http://localhost:8080/github.com/google/gxui/samples/
を開いてみよう!デスクトップと同じgxuiのサンプルがいくつか動くよ! (動かないやつはローカルファイル参照とかしてるやつ)