לא הייתה נקודת התחלה נקייה
הדור הקודם צבר פיצ׳רים ספציפיים ללקוחות והגדרת בילד ישנה.
יצאנו לגרסה 2 על Vite, עם מודול ייחוס ניטרלי אחד שמדגים ישויות אב ובן, רשימה, צפייה, עריכה והוספה.
כל ממשק ניהול חדש ללקוח התחיל אצל בית התוכנה באותה צורה: מעתיקים את הפרויקט הקודם, מוחקים ממנו את הלוגיקה העסקית, ובונים מחדש התחברות, מעטפת, תרגומים ושכבת API. הובלתי את התכנון של ערכת פתיחה רב־פעמית שכל זה כבר מוכן בה, כך שהיום הראשון של הצוות מוקדש לעולם התוכן של הלקוח ולא לתשתית.
בית תוכנה מספק הרבה אפליקציות back-office: ניהול משתמשים, קטלוגים, דשבורדים תפעוליים. בערך 60–70% מתשתית הפרונט שלהן זהה, אבל כל אחת התחילה מ־fork של הקוד של הלקוח הקודם. יחד איתו עברו פיצ׳רים מתים, מבנה תיקיות לא אחיד ותהליכי התחברות שונים במעט. מפתח שעבר בין פרויקטים היה צריך ללמוד מחדש איפה יושב רענון הטוקן, איך עובדים הלואדרים ואיך הפעם טופל ה־RTL בעברית.
התרשים רחב מהמסך: החליקו הצידה לצפייה בכולו →
שום דבר לא מוצג לפני ש־appSettings.json נטען, כך שכתובת ה־API, שפת ועיצוב ברירת המחדל, שם החברה ודגלי הפיתוח תמיד מוגדרים. אותו תוצר בילד יכול לעלות ל־dev, ל־staging ולפרודקשן, ורק הקובץ הזה משתנה.
ההגדרות נטענות מקובץ JSON סטטי בעלייה ונשמרות באובייקט טיפוסי אחד. DevOps יכולים להפנות סביבה מחדש בלי בילד. המחיר: בקשה נוספת לפני הציור הראשון, ולכן האפליקציה ממתינה מאחורי לואדר עד שהיא חוזרת.
Factory ל־thunks ופונקציית עזר ל־reducers נותנים לכל endpoint את אותם מצבים (idle / pending / fulfilled / rejected), אותו מבנה שגיאה ואת הלואדר הגלובלי. endpoint חדש הוא שתי הצהרות קצרות במקום שלושה cases שכותבים ידנית. המחיר: יותר Redux מספריית query-cache, בחירה שנועדה להתאים למעטפת התגובה הסטנדרטית של צד השרת בבית.
תפריט הצד בנוי מ־7 חלקים להרכבה (Aside.Root, Nav, NavList, NavLink, NavButton, MobileHeader, Footer) והכותרת מ־3. כל פרויקט מרכיב תפריט משלו במקום לעשות fork לרכיב. המחיר: יותר קבצים ללמוד ביום הראשון.
עברית היא ברירת המחדל. הכיווניות נגזרת מרשומת השפה ונקבעת כמאפיין data-direction על ה־body, וקובץ LTR קטן הופך אייקונים והיסטים. המחיר: הדריסה משתמשת בכמה חוקים כוחניים שדורשים זהירות כשרכיבים משתנים.
כל הנתיבים יושבים במפה טיפוסית אחת עם מעטפות, guards והפניות. ישות חדשה היא כמה רשומות ולא הגדרת נתב חדשה. דגלי פיתוח (SKIP_AUTHENTICATION, IS_RESPONSIVE) מאפשרים לעבוד על מסכים בלי שרת.
הדור הקודם צבר פיצ׳רים ספציפיים ללקוחות והגדרת בילד ישנה.
יצאנו לגרסה 2 על Vite, עם מודול ייחוס ניטרלי אחד שמדגים ישויות אב ובן, רשימה, צפייה, עריכה והוספה.
ב־/entity/:id/edit סרגל הטאבים וה־dropdown שלו במובייל לא הסכימו מה הפריט הפעיל.
לכל פריט ניווט יש תבנית נתיב, ואותה לוגיקת התאמה מפעילה גם את הטאבים וגם את ה־dropdown.
מסכי הוספה ועריכה צריכים את אותם שדות, אבל עריכה חייבת לחכות לרשומה.
רכיב טופס משותף אחד. במצב עריכה הוא טוען את הרשומה הקיימת ומאתחל את הטופס כשהנתונים מגיעים.
כשטוקן הגישה פג, כל בקשה פתוחה ניסתה לרענן אותו. הרענונים התחרו זה בזה ויכלו לבטל זה את זה ולנתק את המשתמש.
Promise רענון אחד משותף לכל הבקשות שנכשלו. כל בקשה מקורית מנוסה שוב פעם אחת, ואם זה נכשל המשתמש מנותק בצורה מסודרת.
כל שינוי בתפריט חייב לערוך את הרכיב עצמו, והפרויקטים התרחקו זה מזה.
שני הרכיבים עברו ל־compound components, וכל הצרכנים עודכנו באותו שינוי.
שינויי צבע וריווח של פרויקט ספציפי ישבו בתוך הסגנונות המשותפים, וזה הפך שדרוגים לכואבים.
הסגנונות עברו refactor בשני סבבי review, ונשאר קובץ override.scss אחד בתור המקום היחיד שבו פרויקט ממתג את עצמו.
ההתנתקות קרתה רק כשטאב אחר מחק את הטוקן. אם ה־refresh token פג בטאב הנוכחי, המשתמש נשאר על מסך שבור.
פונקציית התנתקות אחת מוחקת את הטוקנים ומשדרת אירוע ברמת האפליקציה, וה־guard של הנתיבים מאזין גם לאירוע הזה וגם לשינויי storage בין טאבים.
הערכות הנדסיות בימי עבודה של מפתח אחד, לפי מה שכבר קיים בערכה. הערכה
| תחום | לפני | עם הערכה |
|---|---|---|
| פתיחת פרויקט | fork לאפליקציה של הלקוח הקודם וניקוי שלה (כשבוע) | עריכת כותרת, favicon וקובץ הגדרות אחד (פחות משעה) |
| הזדהות | התחברות, OTP ורענון נבנים מחדש בכל פעם | 5 מסכים מחוברים, נשאר לחבר את ה־API thunks |
| סביבות | בילד נפרד לכל סביבה | בילד אחד, 7 הגדרות נקראות בזמן ריצה |
| פקיעת טוקן | N קריאות רענון במקביל וניתוקים אקראיים | רענון משותף אחד וניסיון חוזר אחד לכל בקשה |
| עברית / אנגלית | RTL מטופל אחרת בכל פרויקט | כיווניות מרשומת השפה וקובץ דריסת LTR אחד |
| סגנון קוד | מוסכמות שונות לכל צוות | lint בכל commit ופורמט לקבצים שב־stage |
הצעדים הבאים שהייתי דוחף: בדיקות יחידה לשכבת ה־API ול־guards, טעינה עצלה של נתיבים, ופקודת scaffold שמייצרת מודול ישות חדש מתוך מודול הייחוס.
שיחת אבחון חינם · 30 דקות · ללא התחייבות
כתבו בכמה שורות: איזה תהליך או מערכת, מה כואב היום (זמן, טעויות, עלויות או פיילוט AI שנתקע) ומי עובד עם זה. אחרי שיחה קצרה מקבלים תוך כ־3 ימים תוכנית כתובה והצעת מחיר סגורה.
נפתח מייל מוכן מראש · מענה תוך יום עסקים
ה־AI קורא. הקוד סופר.
כל הפרויקטים