Gopherjs compila el código GO (Go.dev) al código JavaScript puro. Su objetivo principal es darle la oportunidad de escribir código frontal en GO que aún se ejecutará en todos los navegadores.
syscall/js compatible con el GO aguas arriba 1.16.Prueba a Gopherjs en el patio de recreo de Gopherjs.
Casi todo, incluidas las goroutinas (documentación de compatibilidad). El rendimiento es bastante bueno en la mayoría de los casos, ver HTML5 Game Engine Benchmark. El CGO no es compatible.
Gopherjs requiere GO 1.19 o más nuevo. Si necesita una versión GO más antigua, puede usar una versión más antigua de Gopherjs.
Instale GopherJS con go install :
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
Si su distribución de GO local según lo informado por go version es más nuevo que Go 1.19, entonces debe establecer la variable de entorno GOPHERJS_GOROOT en un directorio que contiene una distribución GO 1.19. Por ejemplo:
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.
Ahora puede usar gopherjs build [package] , gopherjs build [files] o gopherjs install [package] que se comporta de manera similar a la herramienta go . Para los paquetes main , estos comandos crean un archivo .js y el mapa fuente .js.map en el directorio actual o en $GOPATH/bin . El archivo JavaScript generado se puede usar como de costumbre en un sitio web. Use gopherjs help [command] para obtener una lista de posibles banderas de línea de comandos, por ejemplo, para minificar y observar automáticamente los cambios.
gopherjs utiliza el valor GOOS predeterminado de su plataforma al generar código. Los valores GOOS compatibles son: linux , darwin . Si está en una plataforma diferente (por ejemplo, Windows o FreeBSD), deberá establecer la variable de entorno GOOS en un valor compatible. Por ejemplo, GOOS=linux gopherjs build [package] .
Nota: GopherJS intentará escribir archivos de objetos compilados de los paquetes principales en su directorio $ Goroot/PKG. Si eso falla, volverá a $ GOPATH/PKG.
Si desea utilizar la prueba gopherjs run o gopherjs test para ejecutar el código generado localmente, instale Node.js 18 (o más nuevo).
En las plataformas GOOS compatibles, es posible hacer que las llamadas del sistema (acceso del sistema de archivos, etc.) estén disponibles. Consulte DOC/SYSCALLS.MD para obtener instrucciones sobre cómo hacerlo.
gopherjs serve es un comando útil que puede usar durante el desarrollo. Iniciará un servidor HTTP que sirve en ": 8080" de forma predeterminada, luego compilará dinámicamente sus paquetes GO con Gopherjs y los sirvieron.
Por ejemplo, navegar a http://localhost:8080/example.com/user/project/ debería compilar y ejecutar el paquete GO example.com/user/project . La salida de JavaScript generada se servirá en http://localhost:8080/example.com/user/project/project.js (el nombre del archivo .js será igual al nombre del directorio base). Si el directorio contiene index.html , se servirá, de lo contrario se proporcionará un mínimo index.html que incluye <script src="project.js"></script> , lo que provocará que el JavaScript se ejecute. Todos los demás archivos estáticos también se servirán.
Refrescante en el navegador reconstruirá los archivos servidos si es necesario. Los errores de compilación se mostrarán en la terminal y en la consola del navegador. Además, servirá $ Goroot y $ Gopath para SourcEMaps.
Si incluye un argumento, será la raíz desde la cual se sirve todo. Por ejemplo, si ejecuta gopherjs serve github.com/user/project , el JavaScript generado para el paquete github.com/user/project/mypkg se servirá en http: // localhost: 8080/mypkg/mypkg.js.
Hay algunas variables de entorno específicas de Gopherjs:
GOPHERJS_GOROOT : si se establece, Gopherjs usa este valor como el valor de Goroot predeterminado, en lugar de usar el sistema de sistema como el valor predeterminado de GorootGOPHERJS_SKIP_VERSION_CHECK : si se establece en True, Gopherjs no verificará la versión GO en el Goroot para la compatibilidad con la versión de Gopherjs. Esto es principalmente útil para probar Gopherjs contra versiones inéditas de GO.-m para generar código minificado.int en lugar de (u)int8/16/32/64 .float64 en lugar de float32 . El paquete github.com/gopherjs/gopherjs/js (ver documentación) proporciona funciones para interactuar con las API de JavaScript nativas. Por ejemplo la línea
document . write ( "Hello world!" ) ;se vería así en Go:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )También es posible que desee usar los enlaces DOM, las uniones jQuery (ver ToDomVC Ejemplo) o las enlaces AngularJS. Esas son algunos de los enlaces a las API y bibliotecas de JavaScript de los miembros de la comunidad.
Establezca una variable global en un mapa que contenga las funciones:
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
}Para más detalles, consulte la publicación del blog de Jason Stone sobre Gopherjs.
Gopherjs emula un entorno de 32 bits. Esto significa que int , uint y uintptr tienen una precisión de 32 bits. Sin embargo, se admiten los tipos enteros explícitos de 64 bits int64 y uint64 .
El valor GOOS de este entorno es js , y el valor GOARCH es ecmascript . Puede usar estos valores en restricciones de compilación al escribir código específico de la plataforma. (Gopherjs 1.17 y mayores usaron js como el valor GOARCH ).
La función main se ejecuta como de costumbre después de que todas las funciones init se hayan ejecutado. Las devoluciones de llamada de JavaScript también pueden invocar las funciones GO, incluso después de que la función main haya salido. Por lo tanto, el final de la función main no debe considerarse como el final de la aplicación y no finaliza la ejecución de otras goroutinas.
En el navegador, llamar os.Exit (por ejemplo indirectamente por log.Fatal ) tampoco rescinde la ejecución del programa. Por conveniencia, llama runtime.Goexit para terminar inmediatamente el Goroutine llamado.
Las goroutinas son totalmente compatibles con Gopherjs. La única restricción es que necesita iniciar una nueva goroutine si desea usar un código de bloqueo llamado desde JavaScript externo:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})Cómo funciona:
JavaScript no tiene un concurrencia de concurrencia (excepto los trabajadores web, pero están demasiado separados para ser utilizados para las goroutinas). Debido a eso, las instrucciones en JavaScript nunca están bloqueando. Una llamada de bloqueo congelaría efectivamente la capacidad de respuesta de su página web, por lo que se utilizan llamadas con argumentos de devolución de llamada.
Gopherjs hace un trabajo pesado para trabajar en torno a esta restricción: cada vez que una instrucción está bloqueando (por ejemplo, comunicarse con un canal que no está listo), toda la pila se relajará (= todas las funciones regresarán) y la Goroutine se pondrá a dormir. Luego, se recoge otra Goroutine que está lista para reanudar y se restaurará su pila con todas las variables locales.
Si está buscando hacer cambios en el compilador GopherJS, consulte las pautas del desarrollador para obtener información adicional del desarrollador.