Gopherjs รวบรวมรหัส GO (go.dev) ไปยังรหัส JavaScript บริสุทธิ์ จุดประสงค์หลักคือการให้โอกาสคุณในการเขียนรหัสส่วนหน้าใน GO ซึ่งจะยังคงทำงานในเบราว์เซอร์ทั้งหมด
syscall/js ที่สมบูรณ์แบบเข้ากันได้กับต้นน้ำ GO 1.16ลองใช้ Gopherjs ในสนามเด็กเล่น Gopherjs
เกือบทุกอย่างรวมถึง Goroutines (เอกสารประกอบความเข้ากันได้) ประสิทธิภาพค่อนข้างดีในกรณีส่วนใหญ่ดูเกณฑ์มาตรฐานของเครื่องยนต์เกม HTML5 ไม่รองรับ CGO
Gopherjs ต้องการไป 1.19 หรือใหม่กว่า หากคุณต้องการเวอร์ชัน GO รุ่นเก่าคุณสามารถใช้รุ่น Gopherjs รุ่นเก่าได้
ติดตั้ง gopherjs ด้วย go install :
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
หากการกระจาย GO ในพื้นที่ของคุณตามที่รายงานโดย go version ใหม่กว่า GO 1.19 คุณจะต้องตั้งค่าตัวแปรสภาพแวดล้อม GOPHERJS_GOROOT เป็นไดเรกทอรีที่มีการกระจาย 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 คำสั่งเหล่านี้จะสร้างไฟล์ .js และแผนที่แหล่ง .js.map ในไดเรกทอรีปัจจุบันหรือใน $GOPATH/bin ไฟล์ 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 เป็นคำสั่งที่มีประโยชน์ที่คุณสามารถใช้ในระหว่างการพัฒนา มันจะเริ่มต้นเซิร์ฟเวอร์ HTTP ที่ให้บริการบน ": 8080" โดยค่าเริ่มต้นจากนั้นรวบรวมแพ็คเกจ GO ของคุณด้วย gopherJs แบบไดนามิกและให้บริการ
ตัวอย่างเช่นการนำทางไปยัง 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 จะให้บริการมิฉะนั้น index.html น้อยที่สุดที่มี <script src="project.js"></script> จะถูกจัดเตรียมทำให้ JavaScript ถูกดำเนินการ ไฟล์สแตติกอื่น ๆ ทั้งหมดจะได้รับเช่นกัน
การรีเฟรชในเบราว์เซอร์จะสร้างไฟล์ที่ให้บริการขึ้นมาใหม่หากจำเป็น ข้อผิดพลาดในการรวบรวมจะแสดงในเทอร์มินัลและในคอนโซลเบราว์เซอร์ นอกจากนี้มันจะให้บริการ $ Goroot และ $ gopath สำหรับ sourcemaps
หากคุณรวมถึงการโต้แย้งมันจะเป็นรากที่ให้บริการทุกอย่าง ตัวอย่างเช่นหากคุณเรียกใช้ gopherjs serve github.com/user/project แล้ว JavaScript ที่สร้างขึ้นสำหรับแพ็คเกจ github.com/user/project/mypkg จะเสิร์ฟที่ http: // localhost: 8080/mypkg/mypkg.js
มีตัวแปรสภาพแวดล้อมเฉพาะของ gopherjs:
GOPHERJS_GOROOT - ถ้าตั้งค่า Gopherjs ใช้ค่านี้เป็นค่า goroot เริ่มต้นแทนที่จะใช้ระบบ goroot เป็นค่า Goroot เริ่มต้นGOPHERJS_SKIP_VERSION_CHECK - ถ้าตั้งค่าเป็นจริง gopherjs จะไม่ตรวจสอบเวอร์ชัน Go ใน Goroot เพื่อเข้ากันได้กับ GopherJS สิ่งนี้มีประโยชน์หลักสำหรับการทดสอบ Gopherjs กับ GO รุ่นที่ยังไม่เผยแพร่-m เพื่อสร้างรหัส minifiedint แทน (u)int8/16/32/64float64 แทน 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 )
ฟังก์ชั่น main จะถูกดำเนินการตามปกติหลังจากฟังก์ชั่น init ทั้งหมดทำงาน การเรียกกลับ JavaScript ยังสามารถเรียกใช้ฟังก์ชั่น GO ได้แม้ว่าจะออกจากฟังก์ชั่น main แล้ว ดังนั้นการสิ้นสุดของฟังก์ชั่น main ไม่ควรถือว่าเป็นจุดสิ้นสุดของแอปพลิเคชันและไม่สิ้นสุดการดำเนินการของ goroutines อื่น ๆ
ในเบราว์เซอร์การโทร os.Exit (เช่นทางอ้อมโดย log.Fatal ) ยังไม่ยุติการดำเนินการของโปรแกรม เพื่อความสะดวกจะเรียก runtime.Goexit เพื่อยุติการโทร Goroutine ทันที
Goroutines ได้รับการสนับสนุนอย่างเต็มที่จาก Gopherjs ข้อ จำกัด เพียงอย่างเดียวคือคุณต้องเริ่มต้น goroutine ใหม่หากคุณต้องการใช้รหัสบล็อกที่เรียกจาก JavaScript ภายนอก:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})มันทำงานอย่างไร:
JavaScript ไม่มีแนวคิดเกี่ยวกับการเกิดขึ้นพร้อมกัน (ยกเว้นพนักงานเว็บ แต่สิ่งเหล่านั้นจะถูกแยกออกจากกันอย่างเคร่งครัดเกินกว่าที่จะใช้สำหรับ goroutines) ด้วยเหตุนี้คำแนะนำใน JavaScript จึงไม่เคยปิดกั้น การบล็อกการโทรจะหยุดการตอบสนองของหน้าเว็บของคุณได้อย่างมีประสิทธิภาพดังนั้นการโทรด้วยการโทรกลับจะใช้แทน
Gopherjs ทำการยกอย่างหนักเพื่อแก้ไขข้อ จำกัด นี้: เมื่อใดก็ตามที่คำแนะนำกำลังปิดกั้น (เช่นการสื่อสารกับช่องที่ยังไม่พร้อม) สแต็กทั้งหมดจะผ่อนคลาย (= ฟังก์ชั่นทั้งหมดกลับมา) และ goroutine จะนอนหลับ จากนั้น goroutine อื่นที่พร้อมที่จะกลับมารับกลับมาและสแต็คกับตัวแปรท้องถิ่นทั้งหมดจะได้รับการกู้คืน
หากคุณกำลังมองหาการเปลี่ยนแปลงคอมไพเลอร์ GopherJS โปรดดูแนวทางของนักพัฒนาสำหรับข้อมูลนักพัฒนาเพิ่มเติม