הגדרת Autoprefixer ו-Browserslist ל-CSS חוצה דפדפנים

הפריסה נשברת בדפדפנים של הלקוחות, והתיקונים גוזלים שבועות? אנחנו מגדירים Autoprefixer ו-Browserslist במפתח: סוגרים כשלים חוצי דפדפנים בכל הדפדפנים המיועדים ומקצרים את זמן התחזוקה של הסגנונות פי כמה.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
הגדרת Autoprefixer ו-Browserslist ל-CSS חוצה דפדפנים
פשוט
~2-3 שעות
שאלות נפוצות

Autoprefixer לא מציל: היכן CSS חוצה-דפדפנים נשבר

Autoprefixer מוסיף קידומות ספקים לפי נתוני Browserslist — וזה מספיק כל עוד רשימת הדפדפנים המיועדים משקפת את הקהל האמיתי. הבעיה היא שקובץ התצורה נכתב לרוב פעם אחת ונשכח: הוא חי שנים במאגר, מתכסה בהעתק-הדבק מתבניות זרות, ובזמן הזה התמיכה בדפדפנים משתנה.

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

סוג התקלות הראשון — תכונות ש-Autoprefixer לא נוגע בהן מעצם הגדרתן. תכונות לוגיות, gap במכולות flex, aspect-ratio, :has() — עבורן קידומות לא קיימות, ובמנועים ישנים הפריסה מתפרקת לחלוטין: הרשת מתמוטטת, הרווחים נעלמים, בלוקים דורסים זה את זה.

השני — קידומות מיושנות: אם בתצורה נשאר דפדפן שהוסר מתמיכה, הבנייה תמשיך לייצר כללים מתים, ותנפח את טבלת הסגנונות ותבלבל מפתחים. השלישי — פערים בין מנועים בהתנהגות, ולא בתחביר: פרשנות שונה למידות של רכיבי flex, התמוטטות רווחים, עיגול שברי פיקסל. קידומת כאן לא תעזור — נדרש או מרווח בסימון, או איפוס מפורש.

עבור המשתמש זה נראה אותו דבר: הכפתור חורג מגבול המסך, הטופס מפסיק להישלח, הקטלוג מציג כרטיסים ריקים. הלקוח נודע על כך מפניות לתמיכה, ולא מדוחות — כי הבדיקה נערכה בדפדפן אחד, שבו הכול היה תקין. מפרקים כיצד זה נסגר ברמת תצורת הבנייה ובדיקות הרגרסיה.

מה נותנת הגדרה מדויקת של Autoprefixer ו-Browserslist

התצורה של Autoprefixer ו-Browserslist היא לא "סימון וי בבנייה", אלא שני קבצים שמהם תלוי איזה CSS יגיע לפרודקשן. Autoprefixer קורא את השאילתה של Browserslist ומוסיף קידומות ספק רק עבור אותם מנועים שנמצאים realmente ברשימה.

אם הרשימה מוגדרת בצורה מעורפלת — "הגרסאות האחרונות" בלי הסתייגויות — הקידומות או שנשפכות על הכל, או שלא מגיעות למקום שבו הן נחוצות.

מה משתנה במספרים

נפח הסגנונות. עם רשימה נכונה של דפדפני יעד, Autoprefixer מפסיק לשכפל מאפיינים עבור מנועים שאין לכם בקהל. בפרויקט טיפוסי זה מסיר 8–15% ממשקל חבילת ה-CSS, ובקוד מדור קודם עם flex ו-grid — עד רבע: הקידומות עבור מנועים ישנים נעלמות, נשארות רק אלו שעובדות.

זמן הבנייה. כל דפדפן מיותר בשאילתה — זה מעבר נוסף על כל הכללים. צמצום הרשימה לקהל אמיתי מאיץ את עיבוד הסגנונות ב-20–40% ומקצר באופן ניכר את זמן הטעינה החמה בזמן פיתוח.

סוג הכשלים. הכאב העיקרי — לא "נשבר בכל מקום", אלא "נשבר אצל חלק". תפריט נפתח מתפרק במנוע אחד, הגריד מתקפל במנוע אחר, אלמנט sticky לא נדבק בשלישי. אלו באגים יקרים: תופסים אותם בפרודקשן, משחזרים דרך פרוקסי ומתקנים בעיוורון.

Browserslist מדויק מסיר את סוג הכשלים הזה עצמו — כי הקידומות והפולבקים מוצבים עבור רשימה ספציפית, ולא "בערך".

צפיות במקום ניחושים

רשימת דפדפני היעד מקובעת בקונפיג ומוּגרסת יחד עם הקוד. זה אומר שהתנהגות הפריסה משוחזרת: בנייה על מכונת המפתח, בסביבת הבדיקות ובפרודקשן נותנת את אותו CSS. כל ויכוח "אבל אצלי זה עובד" נסגר בשורה אחת בקונפיג, ולא בבדיקה ידנית בחמישה דפדפנים.

אפקט נפרד — צפיות בעת עדכון הקהל. כשחלקו של מנוע ישן יורד, אתם מסירים אותו מהרשימה בתיקון אחד ומיד רואים כמה CSS יצא מהחבילה.

גישות לקידומת: ידנית, אוטומטית, היברידית

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

המגבלה — הגורם האנושי: קידומת שהוחמצה עבור דפדפן אחד לא נתפסת לא על ידי לינטר ולא על ידי בדיקות, עד שמגיעה תלונה מהמשתמש. במאות חוקים זה הופך לעבודה ידנית מתמדת ולחוסר סנכרון בין קבצים.

קידומת אוטומטית מסירה את העומס הזה: הבונה קורא את רשימת הדפדפנים המיועדים, קובע בעצמו אילו מאפיינים דורשים קידומות, ומוסיף אותן בשלב הבנייה. Autoprefixer עושה זאת על פי נתוני סטטיסטיקת שימוש אמיתית בדפדפנים, ולא על פי הזיכרון של המפתח. הנקודה המרכזית — רשימת יעדים מוגדרת כראוי: היא קובעת מה בדיוק ייכנס ל-CSS הסופי.

אפשרות מתי מתאימה מגבלות
קידומת ידנית פרויקטים קטנים, מאפיינים בודדים, אבות טיפוס גדלה בעלויות עבודה, קל להחמיץ דפדפן, אין מקור אמת יחיד
אוטומטית (Autoprefixer + Browserslist) פרויקטי פרודקשן, עבודת צוות, שחרורים תכופים דורשת רשימת דפדפנים מוגדרת ומקום בבנייה; ביעדים שגויים נותנת CSS מיותר או לא מספק
גישה היברידית קוד לגאסי עם קידומות ידניות וקוד חדש לצידו נדרשת משמעת: חוקים ישנים מנוקים בהדרגה, אחרת כפילויות וקונפליקטים

גישה היברידית — מעברית: האוטומציה מופעלת לכל הקוד החדש, והקידומות הידניות בלגאסי מנוקות עם ההתקדמות בתיקונים. כך הצוות לא כותב מחדש את כל הפרויקט בבת אחת, אבל גם לא גורר שני מנגנונים מקבילים עד אין קץ.

בחירת הגישה נקבעת לא לפי גודל הקוד, אלא לפי מידת הצפיות של רשימת הדפדפנים המיועדים ותדירות השינויים בה.

כיצד אנו מיישמים Autoprefixer ו-Browserslist: שלבי העבודה

אנו מתחילים בבדיקת ה-HTML/CSS: בוחנים אילו מאפיינים כבר דורשים קידומות, היכן הסגנונות נאספים ידנית, ועד כמה מערך הכללים הנוכחי סוטה מהקהל האמיתי של הפרויקט.

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

  1. בדיקת ה-HTML/CSS. מנתחים את הסגנונות הקיימים, מאתרים מאפיינים שנשברים במנועים ישנים ומקומות שבהם הקידומות הוזנו ידנית או, להיפך, נשכחו.
  2. קביעת הדפדפנים המיועדים. מתאמים את רשימת הגרסאות הנתמכות ומקבעים אותה בקונפיגורציה — מקור אמת אחיד במקום הסכמות מפוזרות בצוות.
  3. הגדרת Autoprefixer. מחברים את העיבוד לבניית הסגנונות, מגדירים את כלל browserslist ואת מצב הסרת הקידומות המיותרות, כדי לא לגרור לפרודקשן קוד מיושן.
  4. הרצת הבנייה. בונים מחדש את הסגנונות ומשווים את התוצאה: הקידומות הנדרשות מתווספות אוטומטית, כפילויות וזבל נעלמים.
  5. בדיקת תאימות חוצת-דפדפנים. בודקים תרחישים מרכזיים במנועים המיועדים, בודקים רספונסיביות ומצבי אינטראקציה, מתעדים אי-התאמות.
  6. תיקונים ובדיקה חוזרת. מתקנים את הפגמים שנמצאו, במידת הצורך מתאימים את רשימת הדפדפנים ובונים מחדש.
  7. מסירה. מוסרים את הקונפיגורציה המוגדרת, תיעוד של הכללים והוראות כיצד לשנות את רשימת הדפדפנים המיועדים בלי לסכן את ה-HTML/CSS.

לאחר המסירה, תחזוקת הקידומות מפסיקה להיות שגרה: הכלל מתעדכן בקובץ אחד, והבנייה עצמה מביאה את הסגנונות להתאמה איתו. תארו את המשימה שלכם — נחזור עם הערכה ותוכנית עבודה.

תצורת Browserslist ומדיניות תמיכה בדפדפנים

תצורת Browserslist היא מקור אמת יחיד לגבי אילו דפדפנים נחשבים ליעד. אותו רשימה נקראת על ידי Autoprefixer, מכווץ ה-CSS ומהדר הסקריפטים, ולכן אי-סנכרון ביניהם נמנע: קידומות, תחביר ופוליפילים מכוונים לאותה מטריצת תמיכה.

קובץ ההגדרה נמצא בשורש הפרויקט ומנוהל בגרסאות יחד עם הקוד. את מדיניות התמיכה אנו קובעים במפורש — נתח שוק, גרסאות מג'ור אחרונות, שורות נפרדות למנועים ניידים — ולא כ"גרסאות אחרונות" מעורפלות. כך הבנייה משוחזרת בכל מכונה ובצינור.

  • .browserslistrc או שדה ב-package.json — נקודת עריכה אחודה לכל הכלים
  • רשימת דפדפנים ליעד עם נימוק לכל שורה: נתח שוק, גרסאות מג'ור, מנועים ניידים
  • כללי חריגים — הוצאה מתמיכה של מנועים מיושנים עם תאריך וסיבה
  • הפרדת סביבות: סטים נפרדים לפיתוח ולבנייה מפורסמת
  • בדיקת עדכניות באמצעות npx browserslist — אילו דפדפנים נכנסו בפועל למדגם
  • תיעוד המדיניות: מה נתמך, מה לא ומתי נבחן מחדש את ההחלטה
  • תקנון בחינה מחדש — אחת לרבעון או עם יציאת גרסת מג'ור חדשה של מנוע מרכזי

התיעוד כאן אינו פורמליות: כאשר כעבור חצי שנה עולה השאלה "מדוע הדפדפן הזה ברשימה", התשובה צריכה להיות במאגר, ולא בהתכתבות. כללי חריגים עם תאריך וסיבה מאפשרים להחזיר תמיכה בבטחה, אם נתח המנוע שוב יגדל.

מקרה בוחן: כיצד הגדרת Autoprefixer פתרה תקלות בפריסה

הפרויקט — אזור אישי של חברת שירותים: כמה עשרות מסכים, ספריית קומפוננטות משותפת, בנייה עם PostCSS. הסגנונות נבנו ללא פרופיל יחיד של דפדפנים נתמכים: המפתחים הוסיפו קידומות ידנית ושכפלו מאפיינים "ליתר ביטחון".

עד לשחרור הצטברו 40+ אי-התאמות בין הבדיקה המקומית לפרודקשן, וגיליון הסגנונות תפח עד כדי כך שתיקון של קומפוננטה אחת גרר בנייה מחדש של כל החבילה.

מה היה לפני ההגדרה

Autoprefixer עמד בשרשרת העיבוד, אך ללא תצורת Browserslist — כלומר פעל לפי ברירת מחדל, ללא רשימת יעדים מפורשת. חלק מהמאפיינים נכנסו לבנייה ללא הקידומות הנדרשות, וחלק — עם קידומות לדפדפנים שהפרויקט כבר לא תמך בהם.

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

מה שינו

קיבעו את רשימת הדפדפנים המיועדים בקובץ תצורה נפרד — עם חלוקה לפרודקשן ולבניות פנימיות, כדי שההתנהגות תהיה זהה אצל כל המהנדסים. Autoprefixer החל להוסיף רק את הקידומות שנדרשות בפועל לפי רשימה זו, ולא "ליתר ביטחון". בד בבד נוקו כפילויות ידניות של מאפיינים וכללים מתים שנותרו מתיקונים ישנים.

מדדים לפני ואחרי

מדד לפני אחרי
נפח ה-CSS הבנוי בסיסי −38%
תקלות פריסה בשלב הקבלה ברבעון 40+ 3
זמן תיקון קומפוננטה משותפת בנייה מחדש של כל החבילה בנייה מחדש ממוקדת
אי-התאמות מקומית / פרודקשן קבועות בודדות

הצמצום בנפח נתן לא רק מהירות טעינה: פחות כללים — פחות התנגשויות ביניהם, ולכן חלק מהתקלות נעלמו מעצמן, ללא תיקונים ממוקדים. שלושת המקרים הנותרים התבררו כקשורים לא לקידומות, אלא ללוגיקה של הקומפוננטות — אותם טיפלו בנפרד.

בנפרד ראוי לציין את יכולת התחזוקה: מהנדס חדש רואה כעת את רשימת היעדים בקובץ אחד ואינו מנחש אילו דפדפנים באחריותו. זה מסיר סוג שלם של שגיאות עוד לפני שהן נכנסות לבנייה.

במה שונה Autoprefixer מהצבת קידומות ידנית?

הצבת קידומות ידנית היא כאשר המהנדס עצמו מוסיף -webkit-, -moz- ושאר וריאנטים לפני כל מאפיין, בהסתמך על הזיכרון ועל טבלאות תאימות.

Autoprefixer עושה את אותו הדבר, אך בשלב הבנייה: הוא קורא את ה-CSS, משווה מול מסד הנתונים של תמיכת הדפדפנים ומוסיף רק את הקידומות שבאמת נחוצות עבור רשימת היעדים הנתונה. ההבדל אינו בתוצאה הסופית, אלא במי ומתי מקבל החלטה לגבי כל קידומת.

ההבדל המרכזי הוא מקור האמת. בגישה הידנית הוא נמצא בראשו של המפתח: מישהו זוכר את -webkit-backdrop-filter, מישהו לא, ואותו פרויקט מתכסה בתיקונים לא אחידים. Autoprefixer נשען על Browserslist — קונפיגורציה אחידה שבה מוגדרים דפדפני היעד והגרסאות המינימליות שלהם.

משתנה מדיניות התמיכה — מתקנים שורה אחת, וכל ה-CSS נבנה מחדש עבור היעדים החדשים בלי מעבר ידני על הקבצים.

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

ההבדל השלישי — שחזוריות ותחזוקה. קידומות ידניות חיות בקוד שנים, איש לא בוחן אותן מחדש, והן הופכות בשקט לאשפה. האוטומציה קשורה לבנייה: עדכנו את רשימת הדפדפנים — קיבלנו CSS עדכני בבנייה הבאה.

מהנדס חדש בצוות לא צריך לדעת בעל פה אילו מאפיינים דורשים קידומות — הכלל הזה חי בקונפיגורציה, ולא בזיכרון של מישהו.

הגישה הידנית מוצדקת נקודתית: דף נחיתה חד-פעמי בלי בנייה או דיבוג של מאפיין מסוים. עבור פרויקט שחי ומתפתח, האוטומציה דרך Autoprefixer ו-Browserslist נותנת תוצאה צפויה ומסירה קטגוריה שלמה של שגיאות תאימות.

ספקות טכניים נפוצים בעת הגדרת קידומת

Autoprefixer משתלב לתוך מערכת הבנייה הקיימת ללא שכתוב סגנונות: הוא פועל כתוסף עיבוד-בדיעבד וקולט את ה-CSS שכבר נבנה. אם יש לכם Webpack, Vite, Gulp או שרשרת PostCSS — די להוסיף אותו לרשימת המעבדים, וסדר השלבים האחרים אינו משתנה.

הדבר היחיד שכדאי לבדוק בעת האינטגרציה — הקידומת מתבצעת לאחר קידומת אוטומטית של מאפיינים ולפני המזעור, אחרת חלק ממאפייני הוונדור ייחתכו על ידי האופטימיזטור.

בנוגע לביצועים הספקות בדרך כלל אחד: האם זה יאט את הבנייה. Autoprefixer אינו מנתח מחדש את הסגנונות — הוא פועל על אותו עץ שעליו פועלים שאר תוספי PostCSS, ובפרויקט טיפוסי מוסיף לבנייה שברירי שנייה.

הזמן העיקרי מושקע לא בקידומת, אלא בקריאת תצורת Browserslist, ולכן היא נשמרת במטמון בין הרצות. במצב פיתוח עם טעינה חמה, הקידומות מחושבות מחדש רק עבור קבצים שהשתנו.

בנוגע לדפדפנים מיושנים הנקודה המרכזית — לא "לתמוך בהכול", אלא לקבוע רשימת יעדים מודעת. Browserslist מגדיר את הרשימה הזו במקום אחד, וממנה תלוי אילו קידומות יופיעו בכלל ב-CSS הסופי.

אם היעדים מעורפלים, הקובץ מתנפח בקידומות עבור דפדפנים שאיש אינו משתמש בהם; אם צרים מדי — הפריסה נשברת אצל חלק מהקהל.

האם הקידומת תשבור סגנונות שכבר נכתבו?

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

מה יקרה אם היעדים ב-Browserslist יתיישנו?

רשימת היעדים היא תצורה, ולא קבוע: היא נבחנת מחדש עם שינוי הקהל. כל עוד היא מעודכנת, רק הקידומות הנדרשות נכנסות ל-CSS, והמיותרות אינן מצטברות. אנחנו מקבעים את היעדים בקובץ אחד ובודקים אותם בעת עדכונים מתוכננים, כדי שהתמיכה בדפדפנים ישנים לא תתרחב מבלי לשים לב.

האם ניתן לבטל שינויים אם משהו ישתבש?

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

נדון במשימה שלך בנוגע לקרוסבזרית

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

Autoprefixer ו-Browserslist בצירוף הזה פותרים משימה קונקרטית: הראשון מציב קידומות ספקיות לפי רשימת הדפדפנים המיועדים בפועל, והשני מגדיר את הרשימה הזו בקובץ קונפיגורציה אחד, ולא בראש של המפתח. הדרישה משתנה — מתקנים שורה אחת, וכל הבנייה נבנית מחדש לפי הכיסוי החדש.

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

בנפרד בוחנים מקומות שבהם הקידומות לא יעזרו: גרידים, מכולות גמישות, מאפיינים לא סטנדרטיים ופונטים מערכתיים דורשים פתרונות ידניים. כך ההערכה נקשרת להיקף העבודה, ולא למספר שורות ה-CSS.

מה נכלל בעבודה:

  • ביקורת של הקרוסבזרית הנוכחית וקביעת מטריצת הדפדפנים הנתמכים בפועל;
  • הגדרת Autoprefixer ו-Browserslist בהתאם למטריצה הזו, כולל הפרדת כללים עבור עמודים פנימיים וציבוריים;
  • בדיקת הבנייה: הקידומות מגיעות ל-CSS הסופי, ולא הולכות לאיבוד בשלב המיניפיקציה;
  • השלמה ידנית של מאפיינים שהאוטומציה לא מכסה;
  • בדיקה בדפדפנים ובמכשירים המיועדים, כולל ניידים;
  • תיעוד הקונפיגורציה במאגר, כדי שהכללים לא "יברחו" בתיקונים הבאים;
  • הוראה קצרה לצוות: כיצד לשנות את רשימת הדפדפנים בלי לשבור את הבנייה.

את תוכנית העבודה בונים כך שתראו תוצאה בכל שלב: תחילה מטריצת התמיכה והמצב הנוכחי, לאחר מכן קונפיגורציה ותיקונים, ואז בדיקה בדפדפנים אמיתיים. תארו את המשימה — נחזור עם הערכה, לוחות זמנים ותוכנית ברורה.

הכישורים שלנו:

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1393
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1368
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1139
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1152
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1231
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    641