مقدمة: لماذا WebAssembly وKotlin هما الثنائي المثالي
\n\nتتطلب تطوير الويب الحديث ليس فقط السرعة، بل الأمان أيضًا. WebAssembly (Wasm) هو تنسيق ثنائي منخفض المستوى يتم تنفيذه في المتصفح بسرعة تقترب من السرعة الأصلية. Kotlin، بدوره، هو لغة حديثة متعددة المنصات يتم ترجمتها إلى bytecode JVM وJavaScript، ومؤخرًا إلى WebAssembly.
\n\nالجمع بين Kotlin وWebAssembly يفتح آفاقًا جديدة: يمكنك كتابة منطق معقد بلغة مألوفة مع نظام أنواع قوي، ثم تشغيله في أي متصفح حديث دون تحميل زائد من JavaScript. في هذه المقالة، سنشرح العمل مع WebAssembly وKotlin من الألف إلى الياء: من تثبيت الأدوات إلى نشر التطبيق النهائي.
\n\n1. إعداد البيئة لـ Kotlin/Wasm
\n\nقبل كتابة الكود، يجب تجهيز البيئة. وقت كتابة هذه المقالة، الدعم الرسمي لـ Kotlin/Wasm في مرحلة تجريبية (بدءًا من Kotlin 1.9.20). للعمل، ستحتاج إلى:
\n\n- \n
- JDK 11 أو أعلى (يوصى باستخدام JDK 17) \n
- IntelliJ IDEA (النسخة المجتمعية كافية) أو أي محرر يدعم Gradle \n
- أحدث إصدار من Kotlin (1.9.22+). \n
إنشاء المشروع
\n\nسننشئ مشروع Gradle جديدًا بتكوين متعدد المنصات. في ملف build.gradle.kts، حدد الإضافات وهدف Wasm:
plugins {\n kotlin("multiplatform") version "1.9.22"\n kotlin("plugin.serialization") version "1.9.22" // اختياري\n}\n\nkotlin {\n wasmJs {\n binaries.executable()\n nodejs()\n browser {\n commonWebpackConfig {\n cssSupport {\n enabled.set(true)\n }\n }\n }\n }\n\n sourceSets {\n val commonMain by getting\n val wasmJsMain by getting {\n dependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")\n }\n }\n }\n}\n\nبعد مزامنة Gradle، سيكون هيكل المشروع جاهزًا للترجمة إلى Wasm.
\n\n2. كتابة أول برنامج بـ Kotlin/Wasm
\n\nسننشئ وحدة بسيطة تحسب مضروب العدد - مثال مثالي لإظهار أداء Wasm.
\n\nالكود بلغة Kotlin
\n\nفي مجلد src/wasmJsMain/kotlin، أنشئ ملفًا باسم Main.kt:
import kotlinx.coroutines.*\n\n// دالة سيتم تصديرها إلى Wasm\n@WasmExport\nfun factorial(n: Int): Long {\n if (n < 0) return -1L\n var result = 1L\n for (i in 2..n) {\n result *= i\n }\n return result\n}\n\n// نقطة الدخول للمتصفح\nfun main() {\n println("تم تحميل Kotlin/Wasm!")\n // استخدام coroutines للاستدعاء غير المتزامن\n GlobalScope.launch {\n val result = factorial(10)\n println("مضروب 10: $result")\n }\n}\n\nالتعليمة @WasmExport تجعل الدالة متاحة من JavaScript. لاحظ: لا يمكن تصدير جميع أنواع Kotlin - الأنواع البدائية والسلاسل والمصفوفات هي المدعومة فقط.
البناء والتشغيل
\n\nنفذ أمر Gradle:
\n\n./gradlew wasmJsBrowserDevelopmentRun\n\nبعد البناء، سيفتح المتصفح مع وحدة التحكم حيث سترى المخرجات. إذا نجحت العملية، فقد قمت للتو بتشغيل Kotlin في WebAssembly!
\n\n3. التفاعل مع JavaScript: جسر بين عالمين
\n\nإحدى الإمكانيات الرئيسية لـ Kotlin/Wasm هي التفاعل ثنائي الاتجاه مع JavaScript. يمكنك استدعاء دوال JS من Kotlin والعكس.
\n\nاستدعاء JavaScript من Kotlin
\n\nأضف إلى Main.kt كودًا يستخدم واجهة DOM للمتصفح:
import org.w3c.dom.*\n\n@WasmExport\nfun showAlert(message: String) {\n // استخدام الكائن العام window\n window.alert("Kotlin go