يجمع Gopherjs رمز GO (go.dev) إلى رمز JavaScript النقي. الغرض الرئيسي منه هو إعطائك الفرصة لكتابة الكود الأمامي في GO والتي لا تزال تعمل في جميع المتصفحات.
syscall/js متوافق مع OPSTEAM GO 1.16.إعطاء gopherjs تجربة على ملعب gopherjs.
تقريبا كل شيء ، بما في ذلك goroutines (وثائق التوافق). الأداء جيد جدًا في معظم الحالات ، راجع معيار محرك لعبة HTML5. CGO غير مدعوم.
يتطلب gopherjs الذهاب 1.19 أو الأحدث. إذا كنت بحاجة إلى إصدار SOND 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 على دليل يحتوي على توزيع 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 ، تقوم هذه الأوامر بإنشاء ملف .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 <script src="project.js"></script> فسيتم تقديمه ، وإلا فسيتم توفير أدنى index.html . سيتم تقديم جميع الملفات الثابتة الأخرى أيضًا.
سوف ينعش في المتصفح إعادة بناء ملفات الخدم إذا لزم الأمر. سيتم عرض أخطاء التجميع في المحطة ، وفي وحدة التحكم في المتصفح. بالإضافة إلى ذلك ، سوف يخدم $ 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 System كقيمة Goroot الافتراضيةGOPHERJS_SKIP_VERSION_CHECK - إذا تم ضبطه على True ، فلن يتحقق Gopherjs من إصدار GO في Goroot للحصول على التوافق مع إصدار GopherJS. هذا مفيد في المقام الأول لاختبار gopherjs ضد الإصدارات غير المنشورة من GO.-m لإنشاء رمز مين.int بدلاً من (u)int8/16/32/64 .float64 بدلاً من float32 . الحزمة github.com/gopherjs/gopherjs/js (انظر الوثائق) توفر وظائف للتفاعل مع واجهات برمجة تطبيقات JavaScript الأصلية. على سبيل المثال الخط
document . write ( "Hello world!" ) ;سيبدو هكذا في GO:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )قد ترغب أيضًا في استخدام روابط DOM ، وربط jQuery (انظر مثال TODODVC) أو روابط AngularJS. هذه هي بعض الارتباطات إلى واجهات برمجة تطبيقات JavaScript والمكتبات من قبل أفراد المجتمع.
اضبط متغيرًا عالميًا على خريطة تحتوي على الوظائف:
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 .
يتم دعم goroutines بالكامل بواسطة Gopherjs. التقييد الوحيد هو أنك تحتاج إلى بدء goroutine جديد إذا كنت ترغب في استخدام رمز الحظر المسمى من JavaScript الخارجي:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})كيف تعمل:
ليس لدى JavaScript أي مفهوم للتزامن (باستثناء عمال الويب ، ولكن يتم فصلهم بشكل صارم بحيث لا يمكن استخدامه في Goroutines). ولهذا السبب ، فإن التعليمات في JavaScript لا تمنع أبدًا. من شأن مكالمة الحظر أن تتجمد بشكل فعال من استجابة صفحة الويب الخاصة بك ، لذلك يتم استخدام المكالمات مع وسيطات رد الاتصال بدلاً من ذلك.
يقوم Gopherjs ببعض الرفع الثقيل للعمل حول هذا التقييد: كلما كانت التعليمات تمنع (على سبيل المثال التواصل مع قناة غير جاهزة) ، سيتم استرخاء المكدس بالكامل (= تعود جميع الوظائف) وسيتم وضع goroutine للنوم. ثم يتم اختيار goroutine آخر جاهز للاستئناف وسيتم استعادة مكدسها مع جميع المتغيرات المحلية.
إذا كنت تبحث عن إجراء تغييرات على برنامج التحويل البرمجي GopherJS ، راجع إرشادات المطورين للحصول على معلومات إضافية للمطورين.