GOPHERJS compile le code GO (go.dev) en code JavaScript pur. Son objectif principal est de vous donner la possibilité d'écrire du code frontal dans Go qui fonctionnera toujours dans tous les navigateurs.
syscall/js compatible avec le GO en amont 1.16.Essayez Gopherjs sur le terrain de jeu Gopherjs.
Presque tout, y compris les goroutines (documentation de compatibilité). Les performances sont assez bonnes dans la plupart des cas, voir Benchmark du moteur de jeu HTML5. Le CGO n'est pas pris en charge.
GOPHERJS nécessite GO 1.19 ou plus récent. Si vous avez besoin d'une version GO plus ancienne, vous pouvez utiliser une version plus ancienne GopherJS.
Installez GOPHERJS avec go install :
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
Si votre distribution GO locale comme indiqué par go version est plus récente que Go 1.19, vous devez définir la variable d'environnement GOPHERJS_GOROOT dans un répertoire qui contient une distribution GO 1.19. Par exemple:
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.
Vous pouvez maintenant utiliser gopherjs build [package] , gopherjs build [files] ou gopherjs install [package] qui se comportent similaire à l'outil go . Pour les packages main , ces commandes créent un fichier .js et une carte source .js.map dans le répertoire actuel ou dans $GOPATH/bin . Le fichier JavaScript généré peut être utilisé comme d'habitude sur un site Web. Utilisez gopherjs help [command] pour obtenir une liste des indicateurs de ligne de commande possibles, par exemple pour la minification et surveiller automatiquement les modifications.
gopherjs utilise la valeur GOOS par défaut de votre plateforme lors de la génération de code. Les valeurs GOOS prises en charge sont: linux , darwin . Si vous êtes sur une plate-forme différente (par exemple, Windows ou FreeBSD), vous devrez définir la variable d'environnement GOOS sur une valeur prise en charge. Par exemple, GOOS=linux gopherjs build [package] .
Remarque: GOPHERJS essaiera d'écrire des fichiers d'objets compilés des packages de base vers votre répertoire $ goroot / pkg. Si cela échoue, il retombera à $ GOPATH / PKG.
Si vous souhaitez utiliser gopherjs run ou gopherjs test pour exécuter le code généré localement, installez Node.js 18 (ou plus nouveau).
Sur les plates-formes GOOS prises en charge, il est possible de rendre les appels système (accès au système de fichiers, etc.) disponibles. Voir doc / syscalls.md pour des instructions sur la façon de le faire.
gopherjs serve est une commande utile que vous pouvez utiliser pendant le développement. Il démarrera un serveur HTTP servant ": 8080" par défaut, puis compilera dynamiquement vos packages GO avec GOPHERJS et les servir.
Par exemple, la navigation vers http://localhost:8080/example.com/user/project/ devrait compiler et exécuter le package go example.com/user/project . La sortie JavaScript générée sera servie sur http://localhost:8080/example.com/user/project/project.js (le nom du fichier .js sera égal au nom du répertoire de base). Si le répertoire contient index.html , il sera servi, sinon un index.html minimal.html qui inclut <script src="project.js"></script> sera fourni, ce qui entraînera l'exécution du javascript. Tous les autres fichiers statiques seront également servis.
Le rafraîchissement dans le navigateur reconstruit les fichiers servis si nécessaire. Les erreurs de compilation seront affichées dans le terminal et dans la console du navigateur. De plus, il servira $ goroot et $ gopath pour Sourcemaps.
Si vous incluez un argument, ce sera la racine à partir de laquelle tout est servi. Par exemple, si vous exécutez gopherjs serve github.com/user/project , le javascript généré pour le package github.com/user/project/mypkg sera servi sur http: // localhost: 8080 / mypkg / mypkg.js.
Il existe des variables d'environnement spécifiques à GopherJS:
GOPHERJS_GOROOT - Si défini, Gopherjs utilise cette valeur comme valeur Goroot par défaut, au lieu d'utiliser le système Goroot comme valeur Goroot par défautGOPHERJS_SKIP_VERSION_CHECK - Si défini sur True, GOPHERJS ne vérifiera pas la version Go dans le Goroot pour compatibilité avec la version GOPHERJS. Ceci est principalement utile pour tester GopherJS contre les versions inédites de GO.-m pour générer du code minifié.int au lieu de (u)int8/16/32/64 .float64 au lieu de float32 . Le package github.com/gopherjs/gopherjs/js (voir documentation) fournit des fonctions pour interagir avec les API JavaScript native. Par exemple la ligne
document . write ( "Hello world!" ) ;ressemblerait à ceci en go:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )Vous pouvez également utiliser les liaisons DOM, les liaisons jQuery (voir l'exemple ToDomvc) ou les liaisons angularjs. Ce sont quelques-unes des liaisons aux API et bibliothèques JavaScript par les membres de la communauté.
Définissez une variable globale sur une carte qui contient les fonctions:
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
}Pour plus de détails, voir le blog de Jason Stone sur Gopherjs.
Gopherjs émule un environnement 32 bits. Cela signifie que int , uint et uintptr ont une précision de 32 bits. Cependant, les types entiers explicites 64 bits int64 et uint64 sont pris en charge.
La valeur GOOS de cet environnement est js et la valeur GOARCH est ecmascript . Vous pouvez utiliser ces valeurs dans des contraintes de construction lors de l'écriture de code spécifique à la plate-forme. (GOPHERJS 1.17 et plus a utilisé js comme valeur GOARCH .)
La fonction main est exécutée comme d'habitude, une fois que les fonctions init ont exécuté. Les rappels JavaScript peuvent également invoquer les fonctions GO, même après la sortie de la fonction main . Par conséquent, la fin de la fonction main ne doit pas être considérée comme la fin de l'application et ne met pas fin à l'exécution d'autres goroutines.
Dans le navigateur, appeler os.Exit (par exemple indirectement par log.Fatal ) ne met pas fin également à l'exécution du programme. Pour plus de commodité, il appelle runtime.Goexit pour mettre immédiatement la résiliation de l'appel Goroutine.
Les Goroutines sont pleinement soutenues par GopherJS. La seule restriction est que vous devez démarrer un nouveau Goroutine si vous souhaitez utiliser le code de blocage appelé à partir de JavaScript externe:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})Comment ça marche:
JavaScript n'a aucun concept de concurrence (sauf les travailleurs du Web, mais ceux-ci sont trop strictement séparés pour être utilisés pour les Goroutines). Pour cette raison, les instructions en JavaScript ne bloquent jamais. Un appel de blocage congelerait efficacement la réactivité de votre page Web, de sorte que les appels avec des arguments de rappel sont utilisés à la place.
GOPHERJS fait du levage lourd pour contourner cette restriction: chaque fois qu'une instruction bloque (par exemple, communiquer avec un canal qui n'est pas prêt), la pile entière se détendra (= toutes les fonctions reviendront) et le goroutine sera endormi. Ensuite, un autre goroutine prêt à reprendre est choisi et sa pile avec toutes les variables locales sera restaurée.
Si vous cherchez à modifier le compilateur GOPHERJS, consultez les directives des développeurs pour des informations supplémentaires pour les développeurs.