ערכת פתיחה לממשקי ניהול · AfifAI
מקרה בוחן · פלטפורמת פרונט־אנד · ⁦2025–2026⁩

ערכת פתיחה ב־⁠React שמקצרת הקמה של ממשק ניהול משבועות לימים

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

React 18TypeScript (strict)ViteRedux ToolkitReact Router 6i18next · RTL/LTRAxiosSCSS tokens
לקוח
בית תוכנה ישראלי (חסוי)
התפקיד שלי
ראש צוות, ארכיטקט ומפתח בפועל
ציר זמן
דצמבר 2025 – יוני 2026, גרסה 2.0 בענפי main ו־⁠dev
סטטוס
נמסר
במבט מהיר
≈3 שבועות עד ≈2 ימיםמריפו ריק למסך ניהול מחובר עם נתונים אמיתיים (הערכה)
N עד 1קריאות לרענון טוקן כשכמה בקשות במקביל מקבלות 401
בילד אחדלכל הסביבות. 7 הגדרות נקראות בזמן עלייה ולא נצרבות בבילד.
⁦7,800+⁩שורות TypeScript/TSX שכל פרויקט חדש מתחיל איתן, ועוד 3,400 שורות SCSS
35משפחות רכיבי UI משותפים (80 רכיבים), 8 hooks ו־⁠26 פונקציות עזר
2 × 2כיווניות ועיצוב מובנים: עברית RTL / LTR, בהיר / כהה
הבעיה

כל ממשק ניהול נולד כהעתק של הקודם

בית תוכנה מספק הרבה אפליקציות back-office: ניהול משתמשים, קטלוגים, דשבורדים תפעוליים. בערך ⁦60–70⁩% מתשתית הפרונט שלהן זהה, אבל כל אחת התחילה מ־⁠fork של הקוד של הלקוח הקודם. יחד איתו עברו פיצ׳רים מתים, מבנה תיקיות לא אחיד ותהליכי התחברות שונים במעט. מפתח שעבר בין פרויקטים היה צריך ללמוד מחדש איפה יושב רענון הטוקן, איך עובדים הלואדרים ואיך הפעם טופל ה־⁠RTL בעברית.

מה היה באחריותי

ערכה אחת, דרך עבודה אחת

  • קבעתי את הארכיטקטורה: סדר העלייה, מפת הנתיבים, מחזור החיים של קריאות API, המעטפת וספריית הרכיבים המשותפת.
  • הגדרתי מה פרויקט חדש חייב לשנות (כותרת, הגדרות, API thunks) ובמה אסור לו לגעת.
  • בניתי מודול ייחוס שמדגים את כל התבנית: רשימה, פריט, ישויות־בן, עריכה והוספה, מוכן להעתקה.
  • הובלתי את סבבי ה־⁠code review שעיצבו את ה־⁠refactor של הכותרת, תפריט הצד והסגנונות בגרסה 2.
  • כתבתי README של הקמה צעד־אחר־צעד, במקום ידע שעובר בעל פה.
ארכיטקטורה

קודם קונפיגורציה, אחר כך שפה, ורק אז האפליקציה

התרשים רחב מהמסך: החליקו הצידה לצפייה בכולו →

שום דבר לא מוצג לפני ש־⁠appSettings.json נטען, כך שכתובת ה־⁠API, שפת ועיצוב ברירת המחדל, שם החברה ודגלי הפיתוח תמיד מוגדרים. אותו תוצר בילד יכול לעלות ל־⁠dev, ל־⁠staging ולפרודקשן, ורק הקובץ הזה משתנה.

החלטות תכנון

שהדרך הנכונה תהיה גם הקלה

קונפיגורציה בזמן ריצה במקום משתני סביבה בבילד

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

מחזור חיים אחד לכל קריאת API

Factory ל־⁠thunks ופונקציית עזר ל־⁠reducers נותנים לכל endpoint את אותם מצבים (idle / pending / fulfilled / rejected), אותו מבנה שגיאה ואת הלואדר הגלובלי. endpoint חדש הוא שתי הצהרות קצרות במקום שלושה cases שכותבים ידנית. המחיר: יותר Redux מספריית query-cache, בחירה שנועדה להתאים למעטפת התגובה הסטנדרטית של צד השרת בבית.

Compound components למעטפת

תפריט הצד בנוי מ־⁠7 חלקים להרכבה (Aside.Root, Nav, NavList, NavLink, NavButton, MobileHeader, Footer) והכותרת מ־⁠3. כל פרויקט מרכיב תפריט משלו במקום לעשות fork לרכיב. המחיר: יותר קבצים ללמוד ביום הראשון.

RTL כברירת מחדל, LTR כדריסה

עברית היא ברירת המחדל. הכיווניות נגזרת מרשומת השפה ונקבעת כמאפיין data-direction על ה־⁠body, וקובץ LTR קטן הופך אייקונים והיסטים. המחיר: הדריסה משתמשת בכמה חוקים כוחניים שדורשים זהירות כשרכיבים משתנים.

נתיבים כנתונים

כל הנתיבים יושבים במפה טיפוסית אחת עם מעטפות, guards והפניות. ישות חדשה היא כמה רשומות ולא הגדרת נתב חדשה. דגלי פיתוח (SKIP_AUTHENTICATION, IS_RESPONSIVE) מאפשרים לעבוד על מסכים בלי שרת.

יומן הנדסי

מה תיקנתי כדי שכל פרויקט לא יצטרך לתקן לבד

דצמבר 2025

לא הייתה נקודת התחלה נקייה

הדור הקודם צבר פיצ׳רים ספציפיים ללקוחות והגדרת בילד ישנה.

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

דצמבר 2025

טאב שגוי מסומן בנתיבים מקוננים

ב־⁠/entity/:id/edit סרגל הטאבים וה־⁠dropdown שלו במובייל לא הסכימו מה הפריט הפעיל.

לכל פריט ניווט יש תבנית נתיב, ואותה לוגיקת התאמה מפעילה גם את הטאבים וגם את ה־⁠dropdown.

דצמבר 2025

טופסי עריכה נפתחו ריקים

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

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

הזדהות

גל של 401, גל של רענונים

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

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

יוני 2026

לכותרת ולתפריט הצד היה fork בכל פרויקט

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

שני הרכיבים עברו ל־⁠compound components, וכל הצרכנים עודכנו באותו שינוי.

יוני 2026

סגנונות הבסיס והמיתוג של הפרויקט היו מעורבבים

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

הסגנונות עברו refactor בשני סבבי review, ונשאר קובץ override.scss אחד בתור המקום היחיד שבו פרויקט ממתג את עצמו.

יוני 2026

סשן שפג נשאר פתוח

ההתנתקות קרתה רק כשטאב אחר מחק את הטוקן. אם ה־⁠refresh token פג בטאב הנוכחי, המשתמש נשאר על מסך שבור.

פונקציית התנתקות אחת מוחקת את הטוקנים ומשדרת אירוע ברמת האפליקציה, וה־⁠guard של הנתיבים מאזין גם לאירוע הזה וגם לשינויי storage בין טאבים.

השוואה

הקמת ממשק ניהול חדש: מאפס מול עם הערכה

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

תוצאה

איפה זה נחת

תחוםלפניעם הערכה
פתיחת פרויקטfork לאפליקציה של הלקוח הקודם וניקוי שלה (כשבוע)עריכת כותרת, favicon וקובץ הגדרות אחד (פחות משעה)
הזדהותהתחברות, OTP ורענון נבנים מחדש בכל פעם5 מסכים מחוברים, נשאר לחבר את ה־⁠API thunks
סביבותבילד נפרד לכל סביבהבילד אחד, 7 הגדרות נקראות בזמן ריצה
פקיעת טוקןN קריאות רענון במקביל וניתוקים אקראייםרענון משותף אחד וניסיון חוזר אחד לכל בקשה
עברית / אנגליתRTL מטופל אחרת בכל פרויקטכיווניות מרשומת השפה וקובץ דריסת LTR אחד
סגנון קודמוסכמות שונות לכל צוותlint בכל commit ופורמט לקבצים שב־⁠stage

הצעדים הבאים שהייתי דוחף: בדיקות יחידה לשכבת ה־⁠API ול־⁠guards, טעינה עצלה של נתיבים, ופקודת scaffold שמייצרת מודול ישות חדש מתוך מודול הייחוס.

טכנולוגיות

טכנולוגיות

ליבה
React 18, TypeScript 5 (strict), Vite 5
State וניתוב
Redux Toolkit, React Router 6, react-hook-form
נתונים
Axios עם interceptors להזדהות ולרענון, thunks טיפוסיים
תרגום
i18next (HTTP backend, זיהוי שפה), RTL / LTR
UI
Ant Design, PrimeReact, SCSS design tokens, בהיר / כהה
איכות
ESLint, Prettier, husky, lint-staged, חבילת הרחבות משותפת לעורך

שיחת אבחון חינם · 30 דקות · ללא התחייבות

הביאו תהליך אחד. קבלו תוכנית ומספר לשפר.

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

לשיחת אבחון חינםafif.mansour@gmail.com

נפתח מייל מוכן מראש · מענה תוך יום עסקים

ה־AI קורא. הקוד סופר.

כל הפרויקטים