הבטחת אינטגרציה חלקה וחווית משתמש עקבית בין מסגרות פרונטאנד שונות באמצעות שליטה בבדיקות יכולת פעולה הדדית של Web Components.
בדיקת יכולת פעולה הדדית של Web Components: אימות תאימות חוצת-מסגרות
בנוף הפרונטאנד המתפתח במהירות של ימינו, מפתחים מחפשים כל הזמן פתרונות המקדמים שימוש חוזר, תחזוקתיות ויעילות פיתוח. Web Components הופיעו כתקן רב-עוצמה, המציע רכיבי ממשק משתמש עטופים (encapsulated) ואגנוסטיים למסגרות (framework-agnostic), שניתן להשתמש בהם בפרויקטים שונים ואף במסגרות JavaScript שונות. עם זאת, הכוח האמיתי של Web Components נחשף במלואו כאשר הם יכולים להשתלב בצורה חלקה בכל סביבה, ללא תלות במסגרת הבסיסית. כאן נכנסת לתמונה החשיבות העליונה של בדיקות יכולת פעולה הדדית (interoperability testing) של Web Components. פוסט זה צולל להיבטים הקריטיים של הבטחת שיתוף הפעולה המוצלח של רכיבי ה-Web Components שלכם עם מגוון רחב של מסגרות וספריות פרונטאנד, ובכך מטפח תאימות חוצת-מסגרות אמיתית.
ההבטחה של Web Components
Web Components הם חבילה של ממשקי API של פלטפורמת האינטרנט המאפשרים לכם ליצור תגיות HTML חדשות, מותאמות אישית, רב-פעמיות ועטופות (encapsulated) כדי להפעיל את רכיבי הרשת שלכם. הטכנולוגיות המרכזיות כוללות:
- Custom Elements: ממשקי API להגדרת ויצירת מופעים של אלמנטי HTML מותאמים אישית והתנהגותם.
- Shadow DOM: ממשקי API לעטיפת (encapsulate) ה-DOM וה-CSS, מניעת התנגשויות סגנון והבטחת בידוד הרכיב.
- תבניות HTML: האלמנטים
<template>ו-<slot>ליצירת מבני markup רב-פעמיים.
הטבע האגנוסטי-למסגרות המובנה של Web Components אומר שהם נועדו לעבוד באופן עצמאי מכל מסגרת JavaScript. הבטחה זו, עם זאת, מתממשת במלואה רק אם ניתן לשלב את הרכיבים ולתפעל אותם כראוי בתוך מסגרות פופולריות שונות כמו React, Angular, Vue.js, Svelte, ואפילו ב-HTML/JavaScript פשוט. זה מוביל אותנו לתחום המכריע של בדיקות יכולת פעולה הדדית.
מדוע בדיקות יכולת פעולה הדדית הן קריטיות?
ללא בדיקות יכולת פעולה הדדית מקיפות, ההבטחה של "אגנוסטיות-למסגרות" יכולה להפוך לאתגר משמעותי:
- חוויות משתמש לא עקביות: רכיב עשוי להיראות או להתנהג באופן בלתי צפוי כאשר משתמשים בו במסגרות שונות, מה שמוביל לממשקי משתמש מקוטעים ומבלבלים.
- תקורה פיתוחית מוגברת: מפתחים עשויים להצטרך לכתוב עטיפות (wrappers) ספציפיות למסגרת או פתרונות עוקפים עבור רכיבים שאינם משתלבים בצורה חלקה, מה שמבטל את יתרון השימוש החוזר.
- סיוטי תחזוקה: ניפוי באגים ותחזוקה של רכיבים שמתנהגים באופן לא יציב בסביבות שונות הופך לנטל משמעותי.
- אימוץ מוגבל: אם ספריית Web Components אינה מוכחת כעובדת באופן אמין על פני מסגרות מרכזיות, אימוצה יהיה מוגבל מאוד, מה שיפחית את ערכה הכולל.
- נסיגות בנגישות ובביצועים: רינדור או טיפול באירועים ספציפיים למסגרת עלולים להכניס בשוגג בעיות נגישות או צווארי בקבוק בביצועים שאולי אינם נראים בסביבת בדיקה של מסגרת בודדת.
עבור קהל גלובלי הבונה יישומים עם ערימות טכנולוגיות מגוונות, הבטחה ש-Web Components הם באמת ברי-פעולה-הדדית אינה רק נוהג מומלץ, אלא צורך חיוני לפיתוח יעיל, ניתן להרחבה (scalable) ואמין.
אזורים מרכזיים בבדיקות יכולת פעולה הדדית של Web Components
בדיקות יכולת פעולה הדדית יעילות דורשות גישה שיטתית, המתמקדת בכמה אזורים מרכזיים:
1. רינדור בסיסי וטיפול במאפיינים (Attributes/Properties)
זוהי רמת הבדיקה הבסיסית ביותר. רכיב ה-Web Component שלכם צריך להתרנדר כראוי ולהגיב למאפיינים ולתכונות שלו כמצופה, ללא קשר לאופן שבו הוא נוצר:
- קישור מאפיינים (Attribute Binding): בדקו כיצד מאפייני מחרוזת מועברים ומנותחים. למסגרות יש לעיתים קרובות מוסכמות שונות לקישור מאפיינים (למשל, kebab-case לעומת camelCase).
- קישור תכונות (Property Binding): ודאו שניתן להעביר סוגי נתונים מורכבים (אובייקטים, מערכים, בוליאנים) כתכונות. זוהי לעתים קרובות נקודת שוני בין מסגרות. לדוגמה, ב-React, אתם עשויים להעביר prop ישירות, בעוד שב-Vue, הוא עשוי להיות מקושר עם
v-bind. - פליטת אירועים (Event Emission): ודאו שאירועים מותאמים אישית נשלחים כראוי וניתן להאזין להם על ידי המסגרת המארחת. למסגרות יש לעתים קרובות מנגנוני טיפול באירועים משלהן (למשל,
onEventNameשל React,@event-nameשל Vue). - הקרנת תוכן ב-Slot (Slot Content Projection): ודאו שתוכן המועבר ל-slots (ברירת מחדל ובעלי שם) מתרנדר באופן מדויק בין המסגרות.
דוגמה: קחו רכיב כפתור מותאם אישית, <my-button>, עם מאפיינים כמו color ותכונות כמו disabled. הבדיקה כוללת:
- שימוש ב-
<my-button color="blue"></my-button>ב-HTML פשוט. - שימוש ב-
<my-button color={'blue'}></my-button>ב-React. - שימוש ב-
<my-button :color='"blue"'></my-button>ב-Vue. - לוודא שניתן להגדיר ולבטל את התכונה
disabledכראוי בכל הקשר.
2. עטיפת Shadow DOM ועיצוב
Shadow DOM הוא המפתח לאנקפסולציה של Web Components. עם זאת, אינטראקציות בין סגנונות המסגרת המארחת וסגנונות ה-Shadow DOM של הרכיב דורשות אימות קפדני:
- בידוד סגנון: ודאו שסגנונות המוגדרים בתוך ה-Shadow DOM של ה-Web Component אינם דולפים החוצה ומשפיעים על הדף המארח או על רכיבים אחרים.
- הורשת סגנון: בדקו כיצד משתני CSS (custom properties) וסגנונות בירושה מה-light DOM חודרים ל-Shadow DOM. רוב המסגרות המודרניות מכבדות משתני CSS, אך גרסאות ישנות יותר או תצורות ספציפיות עלולות להציב אתגרים.
- גיליונות סגנונות גלובליים: ודאו שגיליונות סגנונות גלובליים אינם דורסים בטעות את סגנונות הרכיב אלא אם כן הדבר נעשה בכוונה תחילה באמצעות משתני CSS או סלקטורים ספציפיים.
- פתרונות עיצוב ספציפיים למסגרת: לחלק מהמסגרות יש פתרונות עיצוב משלהן (למשל, CSS Modules, styled-components ב-React, scoped CSS של Vue). בדקו כיצד רכיב ה-Web Component שלכם מתנהג כאשר הוא ממוקם בתוך סביבות מעוצבות אלה.
דוגמה: רכיב מודאל עם עיצוב פנימי לכותרת, לגוף ולתחתית שלו. בדקו שהסגנונות הפנימיים הללו כלולים ושהסגנונות הגלובליים בדף אינם שוברים את הפריסה של המודאל. כמו כן, בדקו שניתן להשתמש במשתני CSS שהוגדרו על האלמנט המארח בתוך ה-Shadow DOM של המודאל כדי להתאים אישית את מראהו, למשל, --modal-background-color.
3. קישור נתונים וניהול מצב
אופן זרימת הנתונים אל רכיב ה-Web Component וממנו הוא קריטי ליישומים מורכבים:
- קישור נתונים דו-כיווני: אם הרכיב שלכם תומך בקישור דו-כיווני (למשל, שדה קלט), ודאו שהוא עובד בצורה חלקה עם מסגרות שיש להן מנגנוני קישור דו-כיווני משלהן (כמו
ngModelשל Angular אוv-modelשל Vue). זה כרוך לעתים קרובות בהאזנה לאירועי קלט ועדכון תכונות. - אינטגרציה עם מצב המסגרת: בדקו כיצד המצב הפנימי של הרכיב שלכם (אם קיים) מקיים אינטראקציה עם פתרונות ניהול המצב של המסגרת המארחת (למשל, Redux, Vuex, Zustand, שירותי Angular).
- מבני נתונים מורכבים: ודאו שאובייקטי נתונים ומערכים מורכבים המועברים כתכונות מטופלים כראוי, במיוחד כאשר מתרחשות מוטציות בתוך הרכיב או המסגרת.
דוגמה: רכיב קלט בטופס המשתמש ב-v-model ב-Vue. ה-Web Component צריך לפלוט אירוע `input` עם הערך החדש, אותו v-model של Vue יתפוס ויעדכן את תכונת הנתונים המקושרת.
4. טיפול באירועים ותקשורת
רכיבים צריכים לתקשר עם סביבתם. בדיקת טיפול באירועים בין מסגרות היא חיונית:
- שמות אירועים מותאמים אישית: ודאו עקביות בשמות אירועים מותאמים אישית ובמטען הנתונים (payloads).
- אירועי דפדפן טבעיים: ודאו שאירועי דפדפן טבעיים (כמו `click`, `focus`, `blur`) מועברים כראוי וניתן לתפוס אותם על ידי המסגרת המארחת.
- עטיפות אירועים של מסגרות: חלק מהמסגרות עשויות לעטוף אירועים טבעיים או מותאמים אישית. בדקו שהעטיפות הללו אינן משנות את נתוני האירוע או מונעות ממאזינים להיות מצורפים.
דוגמה: רכיב הניתן לגרירה הפולט אירוע מותאם אישית 'drag-end' עם קואורדינטות. בדקו שניתן לתפוס אירוע זה על ידי רכיב React באמצעות onDragEnd={handleDragEnd} ועל ידי רכיב Vue באמצעות @drag-end="handleDragEnd".
5. קריאות חוזרות של מחזור החיים (Lifecycle Callbacks)
ל-Web Components יש קריאות חוזרות מוגדרות של מחזור החיים (למשל, `connectedCallback`, `disconnectedCallback`, `attributeChangedCallback`). האינטראקציה שלהם עם מחזורי החיים של המסגרת דורשת שיקול דעת זהיר:
- סדר אתחול: הבינו כיצד קריאות החוזרות של מחזור החיים של הרכיב שלכם מופעלות ביחס ל-hooks של מחזור החיים של הרכיב במסגרת המארחת.
- חיבור/ניתוק מה-DOM: ודאו ש-`connectedCallback` ו-`disconnectedCallback` מופעלים באופן אמין כאשר הרכיב נוסף או מוסר מה-DOM על ידי מנוע הרינדור של המסגרת.
- שינויים במאפיינים: ודאו ש-`attributeChangedCallback` צופה נכון בשינויי מאפיינים, במיוחד כאשר מסגרות עשויות לעדכן מאפיינים באופן דינמי.
דוגמה: רכיב שמביא נתונים ב-`connectedCallback` שלו. בדקו שבקשת ה-fetch הזו מתבצעת פעם אחת בלבד כאשר הרכיב מועלה (mounted) על ידי Angular, React, או Vue, ושהיא מנוקה כראוי (למשל, ביטול בקשות fetch) כאשר `disconnectedCallback` מופעל.
6. נגישות (A11y)
נגישות צריכה להיות אזרחית ממדרגה ראשונה. בדיקות יכולת פעולה הדדית חייבות להבטיח שתקני הנגישות נשמרים בין המסגרות:
- מאפייני ARIA: ודאו שתפקידי, מצבי ותכונות ARIA מתאימים מיושמים כראוי ונגישים לטכנולוגיות מסייעות.
- ניווט במקלדת: בדקו שהרכיב ניתן לניווט ותפעול מלא באמצעות מקלדת בהקשר של כל מסגרת.
- ניהול פוקוס: ודאו שניהול הפוקוס בתוך ה-Shadow DOM והאינטראקציה שלו עם אסטרטגיות ניהול הפוקוס של המסגרת המארחת הם חזקים.
- HTML סמנטי: ודאו שהמבנה הבסיסי משתמש באלמנטי HTML מתאימים מבחינה סמנטית.
דוגמה: רכיב Web Component של דיאלוג מותאם אישית חייב לנהל את הפוקוס כראוי, לכלוא אותו בתוך הדיאלוג כשהוא פתוח, ולהחזיר אותו לאלמנט שהפעיל את הדיאלוג כשהוא נסגר. התנהגות זו צריכה להיות עקבית בין אם הדיאלוג משמש ביישום Angular או בדף HTML פשוט.
7. שיקולי ביצועים
הביצועים יכולים להיות מושפעים מאופן האינטראקציה של מסגרות עם Web Components:
- זמן רינדור ראשוני: מדדו באיזו מהירות הרכיב מתרנדר כאשר הוא משולב במסגרות שונות.
- ביצועי עדכון: נטרו את הביצועים במהלך שינויי מצב ורינדורים מחדש. קישור נתונים לא יעיל או מניפולציה מוגזמת של ה-DOM על ידי המסגרת המקיימת אינטראקציה עם הרכיב עלולים לגרום להאטות.
- גודל החבילה (Bundle Size): בעוד ש-Web Components עצמם הם לעתים קרובות רזים, עטיפות המסגרת או תצורות הבנייה יכולות להוסיף תקורה.
דוגמה: רכיב Web Component של טבלת נתונים מורכבת. בדקו את ביצועי הגלילה ומהירות העדכון שלו כאשר הוא מאוכלס באלפי שורות באפליקציית React לעומת אפליקציית JavaScript וניל. חפשו הבדלים בשימוש במעבד ובנפילות פריימים.
8. ניואנסים ומקרי קצה ספציפיים למסגרות
לכל מסגרת יש את המוזרויות והפרשנויות שלה לתקני אינטרנט. בדיקות יסודיות כוללות חשיפה של אלה:
- רינדור בצד השרת (SSR): כיצד רכיב ה-Web Component שלכם מתנהג במהלך SSR? חלק מהמסגרות עלולות להתקשות בביצוע hydration ל-Web Components כראוי לאחר הרינדור הראשוני בשרת.
- מערכות טיפוסים (TypeScript): אם אתם משתמשים ב-TypeScript, ודאו שהגדרות הטיפוסים עבור רכיבי ה-Web Components שלכם תואמות לאופן שבו מסגרות צורכות אותם.
- כלים ותהליכי בנייה: כלי בנייה שונים (Webpack, Vite, Rollup) ו-CLIs של מסגרות יכולים להשפיע על האופן שבו Web Components נארזים ומעובדים.
דוגמה: בדיקת Web Component עם SSR ב-Angular Universal. ודאו שהרכיב מתרנדר כראוי בשרת ולאחר מכן עובר hydration כראוי בצד הלקוח ללא שגיאות או רינדורים מחדש בלתי צפויים.
אסטרטגיות לבדיקות יכולת פעולה הדדית יעילות
אימוץ אסטרטגיית בדיקות חזקה הוא המפתח להשגת תאימות חוצת-מסגרות אמינה:
1. עיצוב חבילת בדיקות מקיפה
חבילת הבדיקות שלכם צריכה לכסות את כל האזורים הקריטיים שהוזכרו לעיל. שקלו:
- בדיקות יחידה (Unit Tests): עבור לוגיקת רכיב בודדת ומצב פנימי.
- בדיקות אינטגרציה (Integration Tests): כדי לאמת אינטראקציות בין רכיב ה-Web Component שלכם למסגרת המארחת. כאן בדיקות יכולת הפעולה ההדדית באמת זורחות.
- בדיקות קצה-לקצה (E2E Tests): כדי לדמות זרימות משתמש ביישומי מסגרות שונות.
2. מינוף מסגרות בדיקה
השתמשו בכלי בדיקה וספריות מבוססים:
- Jest/Vitest: מסגרות בדיקת JavaScript חזקות לבדיקות יחידה ואינטגרציה.
- Playwright/Cypress: לבדיקות קצה-לקצה, המאפשרות לכם לדמות אינטראקציות משתמש בסביבות דפדפן אמיתיות על פני מסגרות שונות.
- WebdriverIO: מסגרת בדיקות E2E חזקה נוספת התומכת במספר דפדפנים.
3. יצירת יישומי בדיקה ספציפיים למסגרות
הדרך היעילה ביותר לבדוק יכולת פעולה הדדית היא ליצור יישומים קטנים וייעודיים או רתמות בדיקה (test harnesses) באמצעות כל מסגרת יעד. למשל:
- אפליקציית בדיקה של React: אפליקציית React מינימלית המייבאת ומשתמשת ברכיבי ה-Web Components שלכם.
- אפליקציית בדיקה של Angular: פרויקט Angular פשוט המדגים את הרכיבים שלכם.
- אפליקציית בדיקה של Vue: יישום Vue.js בסיסי.
- אפליקציית בדיקה של Svelte: פרויקט Svelte.
- אפליקציית HTML/JS פשוטה: קו בסיס להתנהגות אינטרנט סטנדרטית.
בתוך יישומים אלה, כתבו בדיקות אינטגרציה המכוונות באופן ספציפי למקרי שימוש נפוצים ולמלכודות פוטנציאליות.
4. בדיקות אוטומטיות ושילוב CI/CD
הפכו את הבדיקות שלכם לאוטומטיות ככל האפשר ושלבו אותן בצינור האינטגרציה הרציפה/פריסה הרציפה (CI/CD) שלכם. זה מבטיח שכל שינוי קוד מאומת מול כל מסגרות היעד באופן אוטומטי, ותופס רגרסיות בשלב מוקדם.
דוגמה לתהליך עבודה CI/CD:
- דחיפת קוד למאגר.
- שרת CI מפעיל את הבנייה.
- תהליך הבנייה מקמפל Web Components ומגדיר סביבות בדיקה עבור React, Angular, Vue.
- בדיקות אוטומטיות רצות מול כל סביבה (יחידה, אינטגרציה, E2E).
- התראות נשלחות על הצלחה או כישלון של הבדיקות.
- אם הבדיקות עוברות, צינור הפריסה מופעל.
5. פרופיל ביצועים וניטור
שלבו בדיקות ביצועים בחבילה האוטומטית שלכם. השתמשו בכלי מפתחים של הדפדפן או בכלי פרופיל ייעודיים כדי למדוד מדדים מרכזיים כמו זמן טעינה, שימוש בזיכרון ותגובתיות לאינטראקציה בכל הקשר של מסגרת.
6. תיעוד לאינטגרציה עם מסגרות
ספקו תיעוד ברור ותמציתי על אופן השילוב של רכיבי ה-Web Components שלכם עם מסגרות פופולריות. זה כולל:
- הוראות התקנה.
- דוגמאות לקישור מאפיינים ותכונות.
- כיצד לטפל באירועים מותאמים אישית.
- טיפים להתמודדות עם ניואנסים ספציפיים למסגרת (למשל, SSR).
תיעוד זה צריך לשקף את הממצאים מבדיקות יכולת הפעולה ההדדית שלכם.
7. משוב קהילתי ודיווח באגים
עודדו משתמשים לדווח על כל בעיות יכולת פעולה הדדית שהם נתקלים בהן. בסיס משתמשים גלובלי ומגוון ימצא בהכרח מקרי קצה שאולי פספסתם. הקימו ערוצים ברורים לדיווח על באגים וטפלו באופן פעיל בבעיות שדווחו.
כלים וספריות ליכולת פעולה הדדית
בעוד שאתם יכולים לבנות את תשתית הבדיקות שלכם מאפס, מספר כלים יכולים לייעל משמעותית את התהליך:
- LitElement/Lit: ספרייה פופולרית לבניית Web Components, אשר בעצמה עוברת בדיקות חוצות-מסגרות נרחבות. ניתן להתאים את כלי הבדיקה המובנים שלה.
- Stencil: מהדר (compiler) המייצר Web Components סטנדרטיים אך גם מספק כלים לקישורי מסגרות (framework bindings), מה שמפשט את האינטגרציה והבדיקות.
- Testing Library (React Testing Library, Vue Testing Library, וכו'): בעוד שהם מיועדים בעיקר לרכיבים ספציפיים למסגרת, עקרונות בדיקת אינטראקציות משתמש ונגישות חלים גם כאן. ניתן להתאים אותם כדי לבדוק כיצד מסגרות מקיימות אינטראקציה עם האלמנטים המותאמים אישית שלכם.
- עטיפות ספציפיות למסגרות: שקלו ליצור עטיפות (wrappers) קלות משקל עבור רכיבי ה-Web Components שלכם לכל מסגרת. עטיפות אלה יכולות לטפל במוסכמות קישור נתונים ומאזיני אירועים ספציפיים למסגרת, מה שהופך את האינטגרציה לחלקה יותר ומפשט את הבדיקות. לדוגמה, עטיפת React עשויה לתרגם props של React לתכונות ואירועים של Web Component.
שיקולים גלובליים ליכולת פעולה הדדית של Web Components
בעת פיתוח ובדיקה של Web Components עבור קהל גלובלי, מספר גורמים מעבר לתאימות טכנית טהורה נכנסים לתמונה:
- לוקליזציה ובינאום (i18n/l10n): ודאו שהרכיבים שלכם יכולים להכיל בקלות שפות שונות, פורמטי תאריך ופורמטי מספרים. בדיקת זאת פירושה אימות האופן שבו ספריות לוקליזציה מבוססות-מסגרת מקיימות אינטראקציה עם תוכן הטקסט והעיצוב של הרכיב שלכם.
- אזורי זמן ומטבעות: אם הרכיבים שלכם מציגים ערכי זמן או כסף, ודאו שהם מטפלים באזורי זמן ומטבעות שונים כראוי, במיוחד כאשר הם משולבים ביישומים המנהלים הגדרות ספציפיות למשתמש.
- ביצועים באזורים שונים: השהיית רשת (Network latency) יכולה להשתנות באופן משמעותי ברחבי העולם. בדקו את ביצועי ה-Web Component שלכם ברשתות איטיות מדומות כדי להבטיח חוויה טובה למשתמשים באזורים עם תשתית אינטרנט פחות מפותחת.
- תמיכת דפדפנים: בעוד ש-Web Components נתמכים באופן נרחב, לדפדפנים ישנים יותר או לגרסאות דפדפן ספציפיות עשויות להיות אי-עקביות. בדקו על פני מגוון דפדפנים, תוך התחשבות באלה הנפוצים ביותר בשווקים גלובליים שונים.
העתיד של יכולת הפעולה ההדדית של Web Components
ככל ש-Web Components מתבגרים ומסגרות מאמצות אותם יותר ויותר, הגבולות בין Web Components טבעיים לרכיבים ספציפיים למסגרת ממשיכים להיטשטש. מסגרות משתפרות בצריכת Web Components ישירות, והכלים מתפתחים כדי להפוך את האינטגרציה הזו לחלקה יותר. המיקוד של בדיקות יכולת פעולה הדדית צפוי לעבור לשיפור ביצועים, שיפור הנגישות בתרחישים מורכבים, והבטחת אינטגרציה חלקה עם תכונות מתקדמות של מסגרות כמו SSR ורכיבי שרת (server components).
סיכום
בדיקות יכולת פעולה הדדית של Web Components אינן תוספת אופציונלית; הן דרישה בסיסית לבניית רכיבי ממשק משתמש רב-פעמיים, חזקים ותואמים באופן אוניברסלי. על ידי בדיקה שיטתית של טיפול במאפיינים/תכונות, אנקפסולציית Shadow DOM, זרימת נתונים, תקשורת אירועים, עקביות מחזור חיים, נגישות וביצועים על פני מגוון רחב של מסגרות וסביבות פרונטאנד, תוכלו לממש את הפוטנציאל האמיתי של Web Components. גישה ממושמעת זו מבטיחה שהרכיבים שלכם מספקים חווית משתמש עקבית ואמינה, לא משנה היכן או כיצד הם נפרסים, ומעצימה מפתחים ברחבי העולם לבנות יישומים טובים ומקושרים יותר.