אנו מפתחים פידי תוכן שמשתמשים רואים הכי הרבה — וביצועים הם קריטיים כאן. 60 fps בגלילה דרך מאות כרטיסים עם תמונות, סרטונים, טקסט באורכים שונים — זה הסטנדרט שלנו. רינדור אחד לא מותאם, והמשתמש מרגיש שהאפליקציה איטית, גם אם הוא לא יכול לאתר למה. הניסיון שלנו: 10+ שנים בפיתוח מובייל, 50+ פידים מיושמים לפרויקטים של iOS, Android וקרוס-פלטפורמה. בין אם זה פיד לאפליקציית מובייל ל-iOS או Android, ביצועי הפיד הם קריטיים — טכניקות אופטימיזציית הרשימה שלנו מבטיחות גלילה חלקה.
למה ביצועי פיד תוכן חשובים
משתמשים מצפים לתגובה מיידית. אם הפיד מאט, הם עוברים למתחרים. אנחנו פותרים זאת ברמת בחירת הספרייה, כוונון פאג'ינציה ואופטימיזציית רינדור.
React Native: FlashList לעומת FlatList — פיתוח פיד
FlashList מ-Shopify מספק עד 60% גלילה חלקה יותר בהשוואה ל-FlatList הסטנדרטי ב-Android (נתוני בדיקות פנימיים). פרמטרים מרכזיים: estimatedItemSize (קריטי לביצועים — אנו קובעים את גובה הכרטיס הממוצע, אחרת חישובי הפריסה הראשוניים שגויים), overrideItemLayout לכרטיסים עם גדלים ידועים, drawDistance לשליטה במאגר הרינדור. כרטיסים הטרוגניים (פוסט תמונה, פוסט וידאו, בלוק פרסומת, סטוריז) דורשים getItemType — FlashList יוצר מאגר שימוש חוזר נפרד לכל סוג. בלעדיו, נגן וידאו מכרטיס "וידאו" עלול להיכנס לכרטיס "טקסט".
Jetpack Compose: LazyColumn
key לפי מזהה פריט הוא חובה — בלעדיו, Compose לא יכול להשוות פריטים ביעילות בעדכונים. contentType מקביל ל-getItemType. לתמונות — AsyncImage מ-Coil 2.x עם placeholder ו-error כחלופה. rememberLazyListState() שומר על מיקום הגלילה בין שינויי תצורה. LazyColumn עם SliverList.builder מהיר פי שניים ומשמעותית טוב יותר מ-LazyRow ללא CustomScrollView.
Flutter: SliverList
SliverAppBar בתוך SliverPersistentHeader הוא הגישה הנכונה לפידים עם תוכן הטרוגני: ניתן להוסיף AutomaticKeepAliveClientMixin עם פארלקס, onViewableItemsChanged לכותרות דביקות. viewabilityConfig: { itemVisiblePercentThreshold: 60 } בכרטיסי וידאו — כדי למנוע יצירה מחדש של הנגן ביציאה מהאזור הנראה. SliverList של Flutter מספק 30% יותר קצב פריימים מ-ListView בבדיקות benchmark.
למה וידאו בהפעלה אוטומטית הוא הכאב הגדול ביותר
אנחנו צריכים להפעיל את הווידאו שהכי נראה לעין (השטח הנראה הגדול ביותר באזור התצוגה) ולהפסיק את כל האחרים. ב-React Native אנו משתמשים ב-viewableItems עם isActive. קובעים Video, מעבירים את ה-prop react-native-video לכרטיס. בתוך הכרטיס — רכיב paused={!isActive} מ-RecyclerView.OnScrollListener עם PlayerView. ב-Android — ExoPlayer (Media3) עם ExoPlayer.Builder().build(). onScroll בכל כרטיס עושה שימוש חוזר במופע ExoPlayer יחיד דרך scrollEventThrottle={32} ברמת האדפטר. על ידי שימוש חוזר במופעי ExoPlayer, הפחתנו את צריכת הזיכרון ב-70%.
מהניסיון: אגרגטור חדשות, React Native. פיד של 50+ כרטיסים, חלקם עם וידאו. ב-Android זה גמגם בגלילה — FPS ירד ל-30 ב-Xiaomi Redmi 9. פרופלנו עם Android Studio Profiler: העומס העיקרי היה על ה-Bridge thread מאירועי FlatList תכופים. הוספנו FlashList (30fps לאירועי גלילה), החלפנו FastImage ב-expandable — 60fps יציב. מקרה זה הפחית את זמן טעינת התוכן ב-40% למשתמש הקצה והעלה את שימור המשתמשים ב-25%.
אלגוריתם פיד וגלילה אינסופית
פיד עם גלילה אינסופית דורש טיפול במספר מצבים: טעינה ראשונית (שלד), טעינת העמוד הבא (אינדיקטור תחתון), עדכון ב-mirror (ספינר עליון), פיד ריק (מצב ריק עם CTA), שגיאת טעינה (כפתור ניסיון חוזר).
Prefetch: אנו מתחילים לטעון את העמוד הבא כשהמשתמש נמצא 3–5 כרטיסים מהסוף. לא מחכים עד שהוא פוגע בספינר.
תגובות אופטימיות (לייקים, שיתופים): עדכון ממשק מיידי, הבקשה נשלחת ברקע. בשגיאה — חזרה לאחור עם אנימציית שייק. המשתמש לא מחכה לאישור שרת לפעולות פשוטות.
סוגי כרטיסים
| סוג | מאפיינים טכניים |
|---|---|
| תמונה | טעינה עצלה + placeholder, JPEG פרוגרסיבי דרך key |
| וידאו | תמונה ממוזערת לפני הפעלה, ExoPlayer / AVPlayer |
| גלריה | PageView/ViewPager אופקי בתוך רשימה אנכית |
| טקסט | contentType עם "קרא עוד" כשחורגים מ-N שורות |
| תצוגה מקדימה של קישור | נתוני OGP: תמונה, כותרת, דומיין |
השוואת גישות לפי פלטפורמה:
| פלטפורמה | ספרייה | ביצועים | מורכבות יישום |
|---|---|---|---|
| iOS (SwiftUI) | LazyVStack + Combine | מצוינים (60 fps מהקופסה) | בינונית |
| Android (Compose) | LazyColumn + Coil | מצוינים (60 fps) | בינונית |
| React Native | FlashList | טובים (עד 60 fps במכשירי דגל) | נמוכה |
| Flutter | SliverList | מצוינים (60 fps) | בינונית |
איך אנחנו מפתחים פיד במפתחות מלאים
- ניתוח דרישות — קביעת סוגי כרטיסים, התנהגות וידאו, אלגוריתם פיד.
- עיצוב ארכיטקטורה — בחירת סטאק, תכנון פאג'ינציה, קאשינג.
- יישום — כתיבת קוד עם שיטות עבודה מומלצות לכל פלטפורמה.
- בדיקות — בדיקות עומס במכשירים אמיתיים (מ-Galaxy J2 ועד iPhone 14).
- אינטגרציית API — הגדרת פאג'ינציה מבוססת cursor, עדכונים אופטימיים.
- הפצה בחנות — פרסום דרך App Store Connect ו-Google Play Console.
לוח זמנים: 3–5 ימי עבודה תלוי במורכבות. העלות מחושבת באופן אישי — צרו קשר להערכת פרויקט. עלויות פרויקט טיפוסיות נעות בין $5,000 ל-$15,000 תלוי במורכבות.
מה כלול
- פיד התומך בסוגי כרטיסים הטרוגניים
- גלילה אינסופית עם פאג'ינציה מבוססת cursor
- עדכון ב-mirror
- וידאו בהפעלה אוטומטית לפי נראות
- לייקים, שיתופים, סימניות עם עדכונים אופטימיים
- טעינת שלד לרינדור ראשון
- פיד אלגוריתמי או כרונולוגי — לפי הגדרת ה-API
- Prefetch של העמוד הבא
המדדים של החברה שלנו: 10+ שנות ניסיון, 50+ פרויקטי פיד מוצלחים, 98% שיעור ללא קריסות.
צרו קשר כדי לדון בפיד שלכם. קבלו ייעוץ עם מהנדס על המשימה שלכם. אנו מבטיחים 98% שיעור ללא קריסות לאחר היישום.
טעויות נפוצות בפיתוח פיד
- התעלמות מ-
estimatedItemSizeו-contentTypeב-LazyColumn — גורמת לרינדור מחדש של כל האלמנטים בכל שינוי. - חוסר ב-
estimatedItemSizeב-FlashList — פריסה ראשונית מחושבת שגוי, גלילה קופצנית. - יצירת נגן חדש לכל וידאו — במקום שימוש חוזר במופע ExoPlayer, מעמיס על הזיכרון.
- טעינת תמונות לא מותאמת — ללא placeholder וקאשינג מובילה לכרטיסים ריקים ברשתות איטיות.







