GoPherjs는 GO Code (go.dev)를 순수한 JavaScript 코드로 컴파일합니다. 주요 목적은 모든 브라우저에서 여전히 실행되는 프론트 엔드 코드를 작성할 수있는 기회를 제공하는 것입니다.
syscall/js 패키지 구현 완료 업스트림 GO 1.16과 호환됩니다.Gopherjs에게 Gopherjs Playground에서 시도해보십시오.
Goroutines (호환성 문서)를 포함한 거의 모든 것. 성능은 대부분의 경우 상당히 좋습니다. HTML5 게임 엔진 벤치 마크를 참조하십시오. CGO는 지원되지 않습니다.
Gopherjs는 Go 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.
이제 go 도구와 유사하게 작동하는 gopherjs build [package] , gopherjs build [files] 또는 gopherjs install [package] 사용할 수 있습니다. 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 서버를 시작한 다음 Go Pachages를 GoPherjs로 동적으로 컴파일하여 제공합니다.
예를 들어, 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 포함 된 경우, <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는 Goroot에서 Go 버전을 확인하여 GoPherjs 릴리스와의 호환성을 확인하지 않습니다. 이것은 주로 미공개 버전의 GO에 대해 GoPherJS를 테스트하는 데 주로 유용합니다.-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 값은 ecmascript 입니다. 플랫폼 별 코드를 작성할 때 이러한 값을 빌드 제약 조건에서 사용할 수 있습니다. (Gopherjs 1.17 이상은 js GOARCH 값으로 사용했습니다.)
main 함수는 모든 init 기능이 실행 된 후 평소와 같이 실행됩니다. JavaScript 콜백은 main 함수가 종료 된 후에도 GO 기능을 호출 할 수 있습니다. 따라서 main 기능의 끝은 응용 프로그램의 끝으로 간주되어서는 안되며 다른 Goroutines의 실행을 끝내지 않아야합니다.
브라우저에서 os.Exit (예 : log.Fatal 에 의해 간접적으로) 호출도 프로그램의 실행을 종료하지 않습니다. 편의를 위해 runtime.Goexit 호출하여 호출 고리 틴을 즉시 종료합니다.
Goroutines는 Gopherjs가 완전히 지원합니다. 유일한 제한 사항은 외부 JavaScript에서 호출 된 차단 코드를 사용하려면 새로운 고어 라틴을 시작해야한다는 것입니다.
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})작동 방식 :
JavaScript는 동시성 개념이 없습니다 (웹 워커를 제외하고는 너무 엄격하게 분리되어 Goroutines에 사용됩니다). 그로 인해 JavaScript의 지침은 결코 차단되지 않습니다. 블로킹 호출은 웹 페이지의 응답 성을 효과적으로 동결하므로 콜백 인수가있는 호출이 대신 사용됩니다.
Gopherjs는이 제한을 해결하기 위해 약간의 리프팅을 수행합니다. 명령이 차단 될 때마다 (예 : 준비되지 않은 채널과 통신) 전체 스택이 풀리고 (모든 기능이 반환 됨) Goroutine이 잠들게됩니다. 그런 다음 재개 할 준비가 된 또 다른 Goroutine이 선택되고 모든 로컬 변수가 포함 된 스택이 복원됩니다.
GoPherjs 컴파일러를 변경하려면 추가 개발자 정보는 개발자 지침을 참조하십시오.