Gopherjs编译GO代码(GO.DEV)到纯JavaScript代码。其主要目的是让您有机会在GO中编写前端代码,该代码仍将在所有浏览器中运行。
syscall/js软件包实现与上游GO 1.16兼容。在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]或gopherjs install [package] ,其行为与go工具相似。对于main软件包,这些命令在当前目录或$GOPATH/bin中创建.js文件和.js.map源地图。生成的JavaScript文件可以像往常一样在网站中使用。使用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 Package example.com/user/project 。生成的JavaScript输出将在http://localhost:8080/example.com/user/project/project.js (.js文件名等于基本目录名称)。如果该目录包含index.html ,则将提供最小的index.html ,其中包括<script src="project.js"></script> ,导致执行JavaScript。所有其他静态文件也将提供。
如果需要,在浏览器中刷新会重建服务文件。汇编错误将以终端和浏览器控制台显示。此外,它将用于$ goroot和$ gopath的源。
如果您包括一个论点,那将是一切都提供的根源。例如,如果您运行gopherjs serve github.com/user/project则将在http:// localhost:8080/mypkg/mypkg.js提供github.com/user/project/mypkg的生成的JavaScript。
有一些Gopherjs特定的环境变量:
GOPHERJS_GOROOT如果设置,gopherjs使用此值作为默认的goroot值,而不是将系统goroot用作默认的goroot值GOPHERJS_SKIP_VERSION_CHECK如果设置为true,gopherjs将不会在Goroot中检查GO版本是否与Gopherjs版本的兼容。这主要对于针对未发行版本的GO测试Gopherjs很有用。-m命令行标志生成缩小代码。int代替(u)int8/16/32/64 。float64而不是float32 。软件包github.com/gopherjs/gopherjs/js (请参阅文档)提供了与本机JavaScript API进行交互的功能。例如行
document . write ( "Hello world!" ) ;在Go中看起来像这样:
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
}有关更多详细信息,请参见Jason Stone的有关Gopherjs的博客文章。
Gopherjs模拟了32位环境。这意味着int , uint和uintptr的精度为32位。但是,支持显式64位整数int64和uint64 。
该环境的GOOS值是js , GOARCH是ecmascript 。在编写特定于平台的代码时,您可以在构建约束中使用这些值。 (gopherjs 1.17及以上的旧版本使用js作为GOARCH 。)
所有init功能运行后, main函数都像往常一样执行。 JavaScript回调也可以调用GO功能,即使已退出了main函数。因此, main函数的结束不应被视为应用程序的末尾,也不应结束其他goroutines的执行。
在浏览器中,调用os.Exit (例如,通过log.Fatal间接使用)也不会终止程序的执行。为了方便起见,它调用runtime.Goexit立即终止调用Goroutine。
Gopherjs完全支持Goroutines。唯一的限制是,如果要使用来自外部JavaScript的封锁代码,则需要启动新的Goroutine:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})它的工作原理:
JavaScript没有并发概念(除Web工作人员外,但是这些概念是严格分开的,无法用于Goroutines)。因此,JavaScript中的说明永远不会阻止。阻止调用将有效地冻结网页的响应能力,因此使用回调参数的呼叫。
Gopherjs做一些繁重的工作来解决此限制:每当指令阻止(例如与未准备好的通道进行通信)时,整个堆栈将放松(=所有功能返回),并且Goroutine将入睡。然后,另一条准备恢复的goroutine将被恢复,其所有本地变量的堆栈将被恢复。
如果您想更改GoPherjs编译器,请参阅开发人员指南,以获取其他开发人员信息。