GopherJSの紹介


Javascriptを書きたくないでござる!な人向け。

GopherJSってなに?

Goの記述を100%Javascriptに変換してくれるツール。

サイト: http://www.gopherjs.org

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

おや?

image

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のサンプルがいくつか動くよ! (動かないやつはローカルファイル参照とかしてるやつ)