gopherjsは、goコード(go.dev)を純粋なJavaScriptコードにコンパイルします。その主な目的は、すべてのブラウザで実行されるGOでフロントエンドコードを作成する機会を提供することです。
syscall/jsパッケージの実装を完了します。GopherjsをGopherjsの遊び場で試してみてください。
Goroutines(互換性のドキュメント)を含むほぼすべて。ほとんどの場合、パフォーマンスは非常に優れています。HTML5ゲームエンジンベンチマークを参照してください。 CGOはサポートされていません。
gopherjsは、1.19以下に行く必要があります。古いGOバージョンが必要な場合は、古いGopherjsリリースを使用できます。
go installでGopherjsをインストールしてください:
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
go versionで報告されているローカルGOディストリビューションがGO 1.19よりも新しい場合、 GOPHERJS_GOROOT環境変数をGO 1.19分布を含むディレクトリに設定する必要があります。例えば:
go install golang.org/dl/go1.19.13@latest
go1.19.13 download
export GOPHERJS_GOROOT="$(go1.19.13 env GOROOT)" # Also add this line to your .profile or equivalent.
これで、 gopherjs build [package] 、 gopherjs build [files]またはgo gopherjs install [package]を使用できます。 mainパッケージの場合、これらのコマンドは、現在のディレクトリまたは$GOPATH/binに.jsファイルと.js.mapソースマップを作成します。生成されたJavaScriptファイルは、通常どおりWebサイトで使用できます。 gopherjs help [command]を使用して、可能なコマンドラインフラグのリストを取得します。たとえば、削除や自動的に変更を監視します。
gopherjs 、コードを生成するときにプラットフォームのデフォルトGOOS値を使用します。サポートされているGOOS値は、 linux 、 darwinです。別のプラットフォーム(WindowsやFreeBSDなど)にいる場合は、 GOOS環境変数をサポートされている値に設定する必要があります。たとえば、 GOOS=linux gopherjs build [package] 。
注:gopherjsは、コアパッケージのコンパイルされたオブジェクトファイルを$ goroot/pkgディレクトリに書き込もうとします。それが失敗した場合、それは$ gopath/pkgに戻ります。
gopherjs runまたはgopherjs testを使用して生成されたコードをローカルに実行する場合は、node.js 18(または新しい)をインストールします。
サポートされているGOOSプラットフォームでは、システム呼び出し(ファイルシステムアクセスなど)を利用できるようにすることができます。その方法については、doc/syscalls.mdを参照してください。
gopherjs serve開発中に使用できる便利なコマンドです。デフォルトでは「:8080」でhttpサーバーを起動し、GoPherjsでGOパッケージを動的にコンパイルして提供します。
たとえば、 http://localhost:8080/example.com/user/project/に移動すると、goパッケージexample.com/user/projectをコンパイルして実行する必要があります。生成されたJavaScript出力はhttp://localhost:8080/example.com/user/project/project.jsで提供されます(.jsファイル名はベースディレクトリ名と等しくなります)。ディレクトリにindex.htmlが含まれている場合、それは提供されます。それ以外の場合は<script src="project.js"></script>を含む最小限のindex.htmlが提供され、JavaScriptが実行されます。他のすべての静的ファイルも提供されます。
ブラウザでリフレッシュすると、必要に応じて提供されたファイルを再構築します。コンパイルエラーは、ターミナルとブラウザコンソールに表示されます。さらに、sourcemapsに$ gorootと$ gopathを提供します。
引数を含めると、それはすべてが提供されるルートになります。たとえば、 gopherjs serve github.com/user/project場合、パッケージgithub.com/user/project/mypkgの生成されたjavascriptはhttp:// localhost:8080/mypkg/mypkg.jsで提供されます。
Gopherjs固有の環境変数がいくつかあります。
GOPHERJS_GOROOT設定されている場合、gopherjsは、システムGorootをデフォルトのGoroot値として使用する代わりに、この値をデフォルトのGoroot値として使用しますGOPHERJS_SKIP_VERSION_CHECK -trueに設定されている場合、gopherjsはGopherjsリリースとの互換性をGorootでGOバージョンをチェックしません。これは主に、GoPherjsを未発表のGOのバージョンに対してテストするのに役立ちます。-mコマンドラインフラグを使用して、縮小コードを生成します。(u)int8/16/32/64の代わりにint使用します。float32の代わりにfloat64使用します。パッケージgithub.com/gopherjs/gopherjs/js (ドキュメントを参照)は、ネイティブJavaScript APIと相互作用する機能を提供します。たとえば、行
document . write ( "Hello world!" ) ;ゴーではこのようになります:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )また、DOMバインディング、jQueryバインディング(TODOMVCの例を参照)、またはAngularJSバインディングを使用することもできます。これらは、コミュニティメンバーによるJavaScript APIとライブラリへのバインディングの一部です。
関数を含むマップにグローバル変数を設定します。
package main
import "github.com/gopherjs/gopherjs/js"
func main () {
js . Global . Set ( "pet" , map [ string ] interface {}{
"New" : New ,
})
}
type Pet struct {
name string
}
func New ( name string ) * js. Object {
return js . MakeWrapper ( & Pet { name })
}
func ( p * Pet ) Name () string {
return p . name
}
func ( p * Pet ) SetName ( name string ) {
p . name = name
}詳細については、Gopherjsに関するJason Stoneのブログ投稿を参照してください。
Gopherjsは32ビット環境をエミュレートします。これは、 int 、 uint 、 uintptr精度が32ビットであることを意味します。ただし、明示的な64ビット整数int64およびuint64がサポートされています。
この環境のGOOS価値はjsであり、 GOARCH Valueはecmascriptです。プラットフォーム固有のコードを作成するときに、これらの値をビルド制約で使用できます。 (Gopherjs 1.17以降はGOARCH値としてjsを使用しました。)
main関数は、すべてのinit関数が実行された後、通常どおり実行されます。 JavaScriptコールバックは、 main関数が終了した後でも、GO関数を呼び出すこともできます。したがって、 main関数の終わりはアプリケーションの終わりと見なされるべきではなく、他のゴルチンの実行を終了しないでください。
ブラウザでは、 os.Exitを呼び出し( log.Fatalで間接的に間接的に)プログラムの実行を終了しません。便利なため、 runtime.Goexitを呼び出して、すぐに呼び出しゴロウチンを終了します。
ゴルチンはGopherjsによって完全にサポートされています。唯一の制限は、外部JavaScriptから呼び出されたブロッキングコードを使用する場合は、新しいゴルウチンを開始する必要があることです。
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})それがどのように機能するか:
JavaScriptには並行性の概念はありません(Webワーカーを除くが、それらはゴルチンに使用するには厳密に分離されています)。そのため、JavaScriptの指示は決してブロックされていません。ブロッキングコールは、Webページの応答性を効果的にフリーズするため、代わりにコールバックの引数を使用して通話が使用されます。
gopherjsは、この制限を回避するためにいくつかの重い持ち上げを行います。命令がブロックしているときはいつでも(たとえば、準備ができていないチャネルと通信)、スタック全体がリラックスし(=すべての関数が返されます)、ゴロウチンは眠りにつきます。その後、再開する準備ができている別のゴルウチンが選択され、すべてのローカル変数を備えたスタックが復元されます。
Gopherjsコンパイラに変更を加えたい場合は、追加の開発者情報については、開発者のガイドラインを参照してください。