איקס עיגול בClojure – חלק ג׳ צד לקוח בSvelte

איקס עיגול בClojure – חלק ג׳ צד לקוח בSvelte

אז למה לי framework חדש עכשיו?

אז אחריי שבפוסטים הקודמים הסברתי איך לפתח לוגיקה של איקס עיגול וצד שרת, הגיע הזמן לפתח צד לקוח, כאשר המטרה שלי בפוסט זה לממש web-UI קטן ונחמד בשפת svelte שמתממשק עם השרת (והלוגיקה) שכתבתי בפוסטים הקודמים.

התמזל מזלי ובשנה שהתחלתי להתעסק בפיתוח צד לקוח בweb, React יצאה לאוויר העולם כך שלא נאלצתי לעשות שמיניות באוויר עם jQuery כדאי לגרום לדברים לעבוד. מדי פעם התעמקתי מעט בframeworks אחרים אך לא מצאתי שום סיבה טובה לפתח פרויקט גדול בארכיטקטורה שונה. ריבוי הספריות והפופולריות של React בקרב מפתחים הם סיבה טובה למה לבחור בReact כארכיטקטורה המרכזית בפרויקט הבא שלך. אך לאחר שראיתי סרטון קצר שסקר את Svelte גמלה בליבי החלטה להתנסות בהקדם בכתיבה בשפה זו (ספוילר- היה מדהים!).

כתיבה בSvelte מזכירה מאוד כתיבה בReact בכך שגם כאן כותבים באופן דקלרטיבי ולא פונקציונלי אך בשונה מReact הקוד שאתה כותב לא רץ באופן ישיר בדפדפן (כן כן, אני יודע שגם הקוד של React מתקמפל מjsx ל js) אלא מתקמפל לקוד javasript גדול מכוער ומאוד מאוד יעיל. שלא כמו React וספריות רבות אחרות המשתמשות בVirtual DOM בשביל לממש את עדכוני המצב של האתר, בSvelte נהנים משתי העולמות:

  1. כתיבה נוחה באופן דקלרטיבי (בדומה לReact)
  2. ריצה יעילה מאוד של הקוד המושג בעזרת תרגום של קוד הsvelte לקוד js פונקציונאלי הרץ באופן יעיל ומבצע את השינויים בDOM באופן מידי.

להבנה עמוקה יותר של העניין (ובכלל דרך להתחיל להיכנס לשפה) מומלץ להסתכל כאן.

וכעת נעבור לקוד

את הקוד עצמו מימשתי בשתי איטרציות. שלב ראשון UI מכוער אבל עובד קצה אל קצה, שלב שני להוסיף עיצוב מגניב. באופן כללי כשאני עובד על פרוייקטים של UI אני משתדל לממש בשלב הראשון קצה אל קצה כדי שיהיה אפשר למצוא בעיות באינטגרציה עם צד השרת בשלב מוקדם.

מימוש פונקציונליות של המשחק

נתחיל במימוש של כפתור המתחיל משחק חדש:

כל קובץ svelte מתחלק ל3 חלקים, סקריפט, HTML וCSS. החלק העליון, הסקריפט כתוב בJS שם אנחנו מגדירים את הפונקציות ואת המצבים. בחלק האמצעי אנחנו כותבים קוד HTML עם תוספות ייחודיות לsvelte כמו דרך להגדיר רנדור המתבסס על תנאים ולולאות ולעשות binding של מצבים ופונקציות מהחלק של הjs. וכמו כן להשתמש ברכיבים (components) הממומשים בקבצי svelte אחרים. שיכול להשתמש בכל אחד מהמשתנים שהגדרנו בחלק העליון של הסקריפט והחלק השלישי של הקובץ הוא חלק של הcss שמה שמיוחד בו הוא שבשונה מcss רגיל כאן ההשפעה היא מקומית כך שכותרת של h1 בקובץ אחר לא תקבל את הצבע האדום.

בקטע הקוד הנוכחי אני מדגים שימוש בbinding של מידע במשתנה game_id של קריאה לפונקציה startNewGame ושימוש בcss המשפיע אך ורק בscope של הקובץ הנוכחי. (חדי העין ישימו לב שקריאות הAPI מעט שונות מהקריאות בפוסט הקודם, זה מכיוון שעברתי למימוש של serverless בעזרת פונקציות lambda של aws פירוט על כך יהיה ניתן לקרוא בפוסט הבא: איקס עיגול בClojure – חלק ד׳ עולים לפרודקשיין) .

נוסיף קוד שמרנדר את לוח המשחק:

כדי לרנדר את הלוח אני עושה שימוש בלולאת בhtml המורחב (אופן כתיבת התנאים והלולאות מזכיר מאוד דרך של כתיבת html בצד שרת). ובנוסף לכך אני משתמש ברכיב חיצוני שמימשתי בקובץ Cell.svelte.

השימוש בexport בחלק העליון של הסקריפט בקוד מגדיר שזהו משתנה המקבל את הערך שלו מהרכיב שמשתמש בו (כמו props בReact). הוספתי עיצוב פשוט של מסגרת וגודל קבוע לכל הdiv ברכיב הנוכחי (זה ממש מגניב שהcss לא משפיע על רכיבים אחרים ככה אפשר להגדיר ישרstyle של div בלי להשתמש בclass…) על מנת לקבל לוח בסיסי.

כעת נוסיף גם קוד שמציג את מצב המשחק (תור מי לשחק), מבצע מהלכים על הלוח מציג שגיאות וגם מי ניצח במשחק:

כלח מה שעשיתי זה להוסיף עוד כמה נתונים לתצוגה וקריאת API לmove (בסה״כ מי שמשתמש בכל framework web מודרני ימצא את הקוד ברור וקריא). כמובן שאת הcb שמועבר לCell צריך לממש גם בקובץ שלו:

וזהו סיימנו את השלב הראשון, ממשק שלם מקצה-לקצה בפחות מ80 שורות קוד! מגניב ממש! הנה סרטון קצר של הממשק:

מהו הטבע ללא אסתטיקה?

ועכשיו מגיע הכיף של לעצב את המשחק. בחרתי לעצב את המשחק כמשחק רטרו של שנות ה80. אתחיל בלשנות את הפונט הראשי לפונט רטרו של משחקי מחשב ישנים, על ידי הוספת הפונט לתיקיית הpublic ושינוי הGlobal.css (קובץ שמגיע כמתחילים פרויקט מTemplate).

נוסיף מסך פתיחה מגניב למשחק ע״י שינוי קצת html:

ועוד הרבה css:

הוספתי רכיב חדש AnimatedSpan.svelte שעושה אנימציה על פי מצב פשוט שהוא מקבל כנתון

ואני שולט על המצב שלו עם סקריפט פשוט:

מכיוון שלוקח מעט זמן לקבל תגובה מהשרת, שכן כדי לראות את המהלך צריך לבצע שתי קריאות API (ביצוע המהלך, ועדכון הלוח) הוספתי מימוש של חווית משתמש אופטימית בו אתה מניח שהשרת יאשר את המהלך ואתה מציג את הלוח עם המהלך לפניי שקיבלת אישור מהשרת (כך לדוגמא אפשר ללחוץ על משבצת של היריב ולהחליף אותה לכמה שברירי שנייה לצבע שלך…) הקוד לביצוע די קצר:

וזהו יש לנו משחק! כמה מגניב ופשוט!

את הקוד המלא ניתן לראות כאן. וכאן ניתן לשחק במשחק באון-ליין.

מחשבות לעתיד

הופתעתי לטובה מהזמן הקצר בו עלה בידי לכתוב את הממשק, לכך לי בערך כשעתיים וחצי לכתוב את הצד לקוח כולל עיצוב (אני מעריך שבReact הייתי עושה את זה מהר יותר ב70% אבל כמובן שהזמן הזה ירד עם אימון בשפה). כך שבעתיד אחשוב על svelte ברצינות לפניי שאתחיל את הפרויקט הweb הבא שלי.

בפוסט הבא והאחרון בסדרה אסקור איך מעלים את כל הקוד לפרודקשיין באופן יעיל מהיר וזול.

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

*