PracticU

שיפור ביצועים בריאקט בעזרת memo

בלי כתוביותעם כתוביות
PracticU › קורס ריאקט - React › שיפור ביצועים בריאקט בעזרת memo
מילון מושגים:
תמונה - קובץ גרפי המוצג על המסך. בהקשר של וירטואליזציה או Docker, תבנית מוכנה שממנה יוצרים מכונה או קונטיינר.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
React - ספריית JavaScript לבניית ממשקי משתמש מבוססי רכיבים, שפותחה על ידי פייסבוק.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.

שיפור ביצועים בריאקט בעזרת memo
קומפוננט שמרונדר כל שנייה בלי שה-UI שלו משתנה הוא בזבוז. ההרצאה מראה בעיית ביצועים כזו בשעון, ופתרון עם memo.
הבעיה
לשעון מוסיפים קומפוננט functional בשם DayPartIcon. הוא מקבל את השעה הנוכחית ב-props ומציג תמונה לפי חלק היום. פונקציה getImageByHour בוחרת בין ארבע תמונות בתיקיית assets/images: קפה בין 6 ל-10, מים בין 11 ל-15, יין בין 16 ל-20, ותמונה רביעית בשאר השעות. הקומפוננט מוצג ליד השעה, והעיצוב הוא 40x40 פיקסלים, inline-block וריווח של 3 פיקסלים.
כשכותבים console.log בתוך הקומפוננט רואים שהוא מרונדר מחדש כל שנייה, בעוד התמונה משתנה רק ארבע פעמים ביום. האב מתעדכן כל שנייה, ולכן הבן מצויר מחדש, גם בלי שה-props שלו השתנו.
הפתרון
1. memo: עוטפים את הקומפוננט ב-memo של React. זה קומפוננט שמקבל קומפוננט ומחזיר קומפוננט אחר, ובהתאם נקרא Higher Order Component, או HOC. בהמשך הקורס יוצג איך בונים HOC בעצמנו.
2. התנהגות ברירת המחדל: הקומפוננט מרונדר רק כש-props השתנו. לאחר רענון, הקונסול מציג רנדור יחיד, והשעון ממשיך לרוץ כל שנייה.
3. מה זה Memoization: שיטה לשיפור ביצועים בשמירת מידע בזיכרון ושימוש בו בהמשך, במקום חישוב מחדש. המרצה מסביר שהשם מגיע מהלטינית, מ-memorandum, שפירושו "להיזכר".
4. התאמה עדינה: אפשר להעביר ל-memo פונקציה שמקבלת props קודמים ובאים ומחזירה true או false, כדי להחליט מתי כן לרנדר. המרצה לא משתמש בכך, ורק מזכיר שזה אפשרי.
שימו לב
1. אין שינוי בשעון. הוא ממשיך להתעדכן, ורק הקומפוננט הפנימי לא מצוייר שוב.
2. הכלי שימושי כשיש צורך בייעול ביצועים.
אחרי ההרצאה אפשר לזהות רנדורים מיותרים של קומפוננט ולמנוע אותם עם memo.

פרקי ההרצאה: שיפור ביצועים בריאקט בעזרת memo

  1. 00:00

    פיצר תמונה לפי שעה בשעון

  2. 00:47

    יצירת קומפוננט DayPartIcon

  3. 01:48

    ייבוא ארבע תמונות לשעות היום

  4. 03:34

    בחירת תמונה לפי השעה

  5. 05:13

    עיצוב האייקון ב-CSS

  6. 06:12

    הצגת האייקון ליד השעון

  7. 06:52

    רינדור מיותר בכל שנייה

  8. 09:34

    עטיפת הקומפוננט ב-memo

תמלול ההרצאה: שיפור ביצועים בריאקט בעזרת memo

הטקסט המלא של הדקות הראשונות בהרצאה «שיפור ביצועים בריאקט בעזרת memo» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:20

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

  3. 00:50

    אז אני הולך לכאן, נעשה פה אולי CLS כזה, ננקה, וניגש ונבנה לעצמנו functional component, בואו רגע נמחק את זה, ואני רוצה ליצור אותו בתוכה home זה בסדר ואני אקרא לקומפוננט הזה day art icon איזשהו אייקון שמציג לי חלק מסוים ביום בוא נניח שניקח את כל ה24 שעות נחלק אותם לארבעה חלקים ונציג

  4. 01:29

    אייקון כתלות באותו חלק של היום אני כן רוצה אבל לקבל props אז אני אגדיר אותו בצורה כזאת וזה functional component בסדר והנה יש לנו פה קומפוננט שנקרא day part icon בתוך הprops אני רוצה לקבל את השעה הנוכחית כי לפי השעה אני רוצה להציג את אותו אייקון רגע איזה אייקונים אני רוצה להציג בואו ניגש פה ל-images והנה יש לי פה ארבע תמונות של סוגי

  5. 02:11

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

  6. 02:35

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

  7. 03:17

    כאן אנחנו רוצים את y, האמת ש-y נראה לי בערב קצת ו-t אולי יותר בלילה ו-t בסוף.

  8. 03:34

    מה עוד אנחנו רוצים לעשות? אנחנו רוצים פה להציג את התמונה image ובואו ניקח src שווה ונקרא לפונקציה שאני אבנה פה למטה function get image by hour.

  9. 03:59

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

  10. 04:20

    אז בואו נבדוק כאן את השעה. אם hour בוא נניח גדול שווה ל-6 בבוקר גם hour קטן שווה ל-10 בבוקר. בוא תחזיר לי את coffee. אם hour גדול שווה ל-11 וקטן שווה ל-15, אז אני רוצה לשתות מים, ותביא לי פשוט את התמונה של המים.

  11. 04:55

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

  12. 05:21

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

  13. 05:47

    padding של שלוש פיקסלים בנוסף תן לי עבור התמונה width תפוס לי כמה שאתה יכול וגם height תפוס לי כמה שאתה יכול ושים לי אותה באמצע מבחינה ורטיקלית יש לנו css בואו ניגש לאן אנחנו רוצים אנחנו רוצים לגשת לקלוק ובקלוק שהיה לנו זאת השעה ליד השעה תציג לי את day part icon ותן לו את השעה הנוכחית נניח

  14. 06:31

    new date.gethours זה השעה הנוכחית והנה יש לנו עכשיו אייקון שמציג לנו תמונה כתלות בשעה של היום הנה אנחנו רואים את התמונה המתאימה ליד השעון.

  15. 06:57

    עד כאן הכל בסדר, פרט לבעיית פרפורמנס שקיימת לנו. בואו ניגש רגע לפה, שימו לב לאן. אני נמצא פה בפונקציה ואני רושם בתוך הפונקציה console.log ואת המחרוזת day.part.icon.render זה בעצם מה שקורה.

  16. 07:27

    הפונקציה הזאת בצעד ומחזירה לי את ה-HTML. בואו נציג את הקונסול ותראו שהוא פשוט כותב לי פה day part icon render. קודם כל למה אני רואה פה עוד קונסול לוגים?

  17. 07:54

    זה קטע מעניין. איפה יש לנו קונסול לוג? בואו רגע נריץ console.log בכל הפרויקט. קומפוננט did update כל אלה, הופה, אז אפשר רגע לכבות אותם.

  18. 08:17

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

  19. 08:48

    אבל אני לא רוצה שהוא ירנדר לי אותו כל שנייה כי אין שינוי ב-UI של הקומפורנט אין שינוי זאת אותה התמונה ארבע פעמים ביום אני צריך לשנות את התמונה לא כל שנייה אני צריך לשנות את התמונה כולה ארבע פעמים ב-24 שעות אז מה שקורה עכשיו זה שכל שנייה הוא מצייר לי מחדש את כל הקומפורנט הזה אולי הקומפורננט לא כזה בעייתי לציור אבל עדיין

  20. 09:19

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

  21. 09:45

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

  22. 10:17

    עוטפים את הקומפוננט שלנו.

לקורס המלא: קורס ריאקט אונליין

ההרצאה הקודמת: פונקציות Lifecycle Hooks

ההרצאה הבאה: זליגת React Leaking CSS

הרצאות קשורות מקורסים אחרים

  • בדיקות ביצועים
  • ביצועים של RAID 5 מול RAID 10
  • אינדקס - למה ביצועים משתפרים
  • בדיקת ביצועים עם SQL Profiler

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס NodeJS