[{"data":1,"prerenderedAt":1043},["ShallowReactive",2],{"posts":3,"\u002Ffullstack\u002Fnuxt-4-6-whats-new":239},[4,20,34,47,61,71,81,91,100,108,116,125,133,141,149,158,166,174,186,197,208,218,228],{"path":5,"title":6,"description":7,"type":8,"level":9,"minutes":10,"date":11,"cover":12,"coverAlt":13,"featured":14,"tags":15,"topic":19},"\u002Ffullstack\u002Fnuxt-4-6-whats-new","Nuxt 4.6: מה באמת משנה לכם, ומה לבדוק לפני שמשדרגים","קוד שרת שלא תלוי בגרסת h3, $fetch עם טיפוסים אמיתיים, סשנים מובנים ו־CLI חדש. מה חשוב, מה עדיין ניסיוני, ואיפה השדרוג עלול לשבור.","הסבר","רמת ביניים",11,"2026-10-06","\u002Fimages\u002Fposts\u002Fnuxt-4-6-whats-new.svg","טרמינל שבודק את גרסת Node ומשדרג, תג גרסה 4.6, ו־handler שרת אחד שמתחבר גם ל־Nitro 2 וגם ל־Nitro 3.",false,[16,17,18],"Nuxt","Vue","TypeScript","fullstack",{"path":21,"title":22,"description":23,"type":8,"level":9,"minutes":24,"date":25,"cover":26,"coverAlt":27,"featured":14,"tags":28,"topic":33},"\u002Fai\u002Fopus-5-5-long-running-tasks","לעבוד עם Opus 5.5: משימה אחת, ריצה ארוכה","מה משתנה כשהמודל מחזיק משימה ארוכה לבד: איך מגדירים סוף ברור, נקודות עצירה ב־CLAUDE.md, רשימת משימות בקובץ וסוכני משנה.",8,"2026-10-05","\u002Fimages\u002Fposts\u002Fopus-5-5-long-running-tasks.svg","כרטיס של משימה אחת יוצא לריצה ארוכה, עוצר בתמרור לאישור, מסמן משימות בקובץ, מתחלק לשלושה סוכני משנה ומגיע לדגל סיום עם וי.",[29,30,31,32],"AI","Claude Code","Agents","Opus 5.5","ai",{"path":35,"title":36,"description":37,"type":38,"level":9,"minutes":39,"date":25,"cover":40,"coverAlt":41,"featured":14,"tags":42,"topic":19},"\u002Ffullstack\u002Fshare-local-dev-server-ssh-tunnel","לשתף שרת פיתוח מקומי בכתובת HTTPS, עם SSH ו־nginx","במקום ngrok: מנהרת SSH הפוכה לשרת שלכם, nginx שמנתב כל תת־דומיין לפורט אחר, תעודת wildcard וסיסמה. כל שלב מוסבר: למה, איך, ומה אמורים לראות.","מדריך",30,"\u002Fimages\u002Fposts\u002Fshare-local-dev-server-ssh-tunnel.svg","מחשב עם שרת פיתוח מקומי מחובר במנהרת SSH לשרת, שמעביר את הבקשה לפורט הנכון, דרך מנעול HTTPS, עד לקישור שנפתח בטלפון.",[43,44,45,46],"SSH","nginx","HTTPS","DevOps",{"path":48,"title":49,"description":50,"type":38,"level":9,"minutes":51,"date":52,"cover":53,"coverAlt":54,"featured":14,"tags":55,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-cloudflare-tunnel","גישה ל-Home Assistant מחוץ לבית עם Cloudflare Tunnel","מחברים את Home Assistant לכתובת משלכם בלי לפתוח פורט בנתב. מדריך ל-Home Assistant OS ול-Docker, עם הרשאות גישה ובדיקות מהטלפון.",14,"2026-10-04","\u002Fimages\u002Fposts\u002Fhome-assistant-cloudflare-tunnel.svg","טלפון מחוץ לבית מתחבר דרך Cloudflare Tunnel ומחבר מקומי ל-Home Assistant בבית.",[56,57,58,59],"Home Assistant","Cloudflare","Docker","בית חכם","smart-home",{"path":62,"title":63,"description":64,"type":38,"level":65,"minutes":24,"date":66,"cover":67,"coverAlt":68,"featured":14,"tags":69,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-backup-update-recovery","גיבוי שאפשר לשחזר, ועדכון שאפשר להתאושש ממנו","מגדירים עותק גיבוי מחוץ לשרת, שומרים מפתח הצפנה ובודקים שחזור מבודד לפני שמעדכנים את הבית הפעיל.","למתחילים","2026-09-29","\u002Fimages\u002Fposts\u002Fhome-assistant-backup-update-recovery.svg","שרת מקומי, ארכיון גיבוי ועותק חיצוני מחוברים למסלול שחזור.",[56,58,70],"גיבוי",{"path":72,"title":73,"description":74,"type":38,"level":65,"minutes":24,"date":75,"cover":76,"coverAlt":77,"featured":14,"tags":78,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-device-maintenance","חיישן נעלם? תחזוקה של מכשירים וסוללות","בונים רשימת תחזוקה קצרה, מפרידים בין סוללה חלשה למכשיר לא זמין ומאתרים בעיות דיווח בלי לאפס את הרשת.","2026-09-24","\u002Fimages\u002Fposts\u002Fhome-assistant-device-maintenance.svg","סוללה חלשה, רשת מכשירים עם צומת לא זמין וכלי תחזוקה.",[56,79,80],"חיישנים","Zigbee",{"path":82,"title":83,"description":84,"type":38,"level":65,"minutes":24,"date":85,"cover":86,"coverAlt":87,"featured":14,"tags":88,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-washing-machine-finished","מכונת הכביסה סיימה: התראה לפי צריכת חשמל","מודדים מחזור כביסה, מגדירים ספי הספק מתוך הנתונים ושולחים התראה רק אחרי ריצה שזוהתה, עם טיפול בדיווח חסר.","2026-09-19","\u002Fimages\u002Fposts\u002Fhome-assistant-washing-machine-finished.svg","מכונת כביסה מחוברת לגרף צריכת הספק ולהודעת סיום בטלפון.",[56,89,90,79],"אוטומציות","YAML",{"path":92,"title":93,"description":94,"type":38,"level":65,"minutes":95,"date":96,"cover":97,"coverAlt":98,"featured":14,"tags":99,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-smart-button-actions","כפתור חכם במקום עוד אפליקציה","מחברים כפתור פיזי לפעולה יומיומית, מזהים איך האינטגרציה מדווחת על לחיצות ובודקים תגובה בלי להסתמך על דגם מסוים.",7,"2026-09-14","\u002Fimages\u002Fposts\u002Fhome-assistant-smart-button-actions.svg","יד לוחצת על כפתור פיזי שמפעיל תאורה ותריס במסגרת סצנה.",[56,89,80],{"path":101,"title":102,"description":103,"type":38,"level":65,"minutes":95,"date":104,"cover":105,"coverAlt":106,"featured":14,"tags":107,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-helpers-house-modes","Helpers: נותנים לבית מצבים וזיכרון","מוסיפים מצב אורחים שנשלט מלוח הבקרה, מחברים אותו לתנאי באוטומציה ובודקים מה קורה אחרי אתחול.","2026-09-09","\u002Fimages\u002Fposts\u002Fhome-assistant-helpers-house-modes.svg","בורר מצבי בית מחובר למתגי עזר שמייצגים אורחים, יציאה והשהיה.",[56,89,90],{"path":109,"title":110,"description":111,"type":38,"level":65,"minutes":95,"date":112,"cover":113,"coverAlt":114,"featured":14,"tags":115,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-automation-debugging","האוטומציה לא עבדה: מוצאים את הסיבה","בודקים טריגרים, תנאים ופעולות לפי הסדר, קוראים Trace ומבחינים בין תקלה בחיישן לבין כלל שלא התקיים.","2026-09-04","\u002Fimages\u002Fposts\u002Fhome-assistant-automation-debugging.svg","מסלול אוטומציה מתפצל לתנאי ולפעולה, וזכוכית מגדלת מדגישה את נקודת הבדיקה.",[56,89,90],{"path":117,"title":118,"description":119,"type":38,"level":65,"minutes":95,"date":120,"cover":121,"coverAlt":122,"featured":14,"tags":123,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-light-manual-control","האור נכבה כשאתם עדיין בחדר? שיפור אוטומציית התאורה","משפרים תאורה לפי תנועה בעזרת כיבוי נפרד ומתג להשארת אור, ובודקים מה קורה בזמן קריאה, בהפעלה מחדש ובשחרור השליטה הידנית.","2026-08-30","\u002Fimages\u002Fposts\u002Fhome-assistant-light-manual-control.svg","חיישן תנועה, אדם בחדר ומנורה מופיעים לצד מתג שמאפשר להשהות כיבוי אוטומטי.",[56,59,89,124],"תאורה",{"path":126,"title":127,"description":128,"type":38,"level":65,"minutes":24,"date":129,"cover":130,"coverAlt":131,"featured":14,"tags":132,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-presence-detection","מי בבית? זיהוי נוכחות בלי כיבויים מפתיעים","מחברים את הטלפון לישות Person, בודקים זיהוי כניסה ויציאה ובונים התראת עזיבה שממתינה ולא מתייחסת למידע חסר כאל בית ריק.","2026-08-25","\u002Fimages\u002Fposts\u002Fhome-assistant-presence-detection.svg","שני אנשים מחוץ לבית, אזור נוכחות סביב הבית ושעון להשהיית פעולות יציאה.",[56,59,89],{"path":134,"title":135,"description":136,"type":38,"level":65,"minutes":95,"date":137,"cover":138,"coverAlt":139,"featured":14,"tags":140,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-useful-notifications","התראות שימושיות בלי להציף את הטלפון","מגדירים התראה כשהדלת נשארת פתוחה, בודקים הודעת ניסיון ומונעים הודעות חוזרות על כל פתיחה קצרה.","2026-08-20","\u002Fimages\u002Fposts\u002Fhome-assistant-useful-notifications.svg","דלת פתוחה מחוברת לשעון המתנה ולהתראה אחת בטלפון.",[56,59,89],{"path":142,"title":143,"description":144,"type":38,"level":65,"minutes":95,"date":145,"cover":146,"coverAlt":147,"featured":14,"tags":148,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-scenes-scripts","לילה טוב בלחיצה אחת: סצנות וסקריפטים","יוצרים סצנת ערב וסקריפט ״לילה טוב״ ב-Home Assistant, ומבינים מתי לשמור מצבים ומתי להריץ רצף פעולות.","2026-08-15","\u002Fimages\u002Fposts\u002Fhome-assistant-scenes-scripts.svg","כפתור אחד מפעיל רצף פעולות שמוביל לבית במצב לילה.",[56,59,89],{"path":150,"title":151,"description":152,"type":38,"level":65,"minutes":95,"date":153,"cover":154,"coverAlt":155,"featured":14,"tags":156,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-family-dashboard","לוח בקרה שבני הבית באמת ישתמשו בו","בונים לוח בקרה מובנה ב-Home Assistant עם חדרים, כפתורים ברורים ותצוגה נוחה בטלפון, בלי להתקין הרחבות.","2026-08-10","\u002Fimages\u002Fposts\u002Fhome-assistant-family-dashboard.svg","לוח בקרה גדול עם כפתורי תאורה וטמפרטורה מופיע לצד גרסה מותאמת לטלפון.",[56,59,157],"Dashboard",{"path":159,"title":160,"description":161,"type":38,"level":65,"minutes":95,"date":162,"cover":163,"coverAlt":164,"featured":14,"tags":165,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-organize-devices","עושים סדר בבית: חדרים, מכשירים וישויות","מסדרים את Home Assistant לפי חדרים, מבינים מה ההבדל בין מכשיר לישות ובוחרים שמות שקל למצוא בלי לשבור אוטומציות.","2026-08-05","\u002Fimages\u002Fposts\u002Fhome-assistant-organize-devices.svg","תוכנית חדרים מחוברת למכשיר אחד ולשלוש ישויות נפרדות.",[56,59,89],{"path":167,"title":168,"description":169,"type":38,"level":65,"minutes":24,"date":170,"cover":171,"coverAlt":172,"featured":14,"tags":173,"topic":60},"\u002Fsmart-home\u002Fhome-assistant-hallway-motion-light","תנועה במסדרון, אור שנדלק: אוטומציה ראשונה ב־Home Assistant","מדליקים תאורה כשמזוהה תנועה ומכבים אחרי שתי דקות ללא תנועה, עם YAML מלא והסבר על טריגרים ובדיקות.","2026-07-31","\u002Fimages\u002Fposts\u002Fhome-assistant-hallway-motion-light.svg","מסדרון ביתי עם חיישן תנועה ותאורת תקרה שנדלקת כשאדם נכנס",[56,89,124,90],{"path":175,"title":176,"description":177,"type":38,"level":9,"minutes":24,"date":178,"cover":179,"coverAlt":180,"featured":14,"tags":181,"topic":19},"\u002Ffullstack\u002Ffetch-http-errors-and-timeouts","למה Fetch לא זורק שגיאה כשהשרת מחזיר 404?","ההבדל בין כישלון רשת לתשובת HTTP, טיפול בגוף תשובה לא צפוי והגבלת זמן לבקשה, עם פונקציה שאפשר להריץ.","2026-07-26","\u002Fimages\u002Fposts\u002Ffetch-http-errors-and-timeouts.svg","בקשת Fetch מתפצלת לתשובת HTTP עם שגיאה ולכשל רשת או פסק זמן",[182,183,184,185],"JavaScript","Fetch","HTTP","Debugging",{"path":187,"title":188,"description":189,"type":8,"level":65,"minutes":24,"date":190,"cover":191,"coverAlt":192,"featured":14,"tags":193,"topic":33},"\u002Fai\u002Frag-answering-from-your-documents","RAG: איך נותנים למודל לענות מתוך המסמכים שלכם","מה מחפשים לפני שמבקשים מהמודל לכתוב, למה קטעי המקור חשובים, ואיך בודקים אם התשובה באמת נשענת עליהם.","2026-07-21","\u002Fimages\u002Fposts\u002Frag-answering-from-your-documents.svg","מסמכי מקור נבדקים בזכוכית מגדלת, קטע מתאים נבחר ועובר לכרטיס תשובה",[29,194,195,196],"RAG","חיפוש","מסמכים",{"path":198,"title":199,"description":200,"type":8,"level":65,"minutes":24,"date":201,"cover":202,"coverAlt":203,"featured":14,"tags":204,"topic":60},"\u002Fsmart-home\u002Fmatter-thread-zigbee-explained","Matter, Thread ו־Zigbee: מה ההבדל ומה צריך בבית?","שלושת השמות אינם מתארים את אותו סוג של דבר. הסבר על שכבות התקשורת, תפקידי הרכזת ובדיקת התאמה למערכת קיימת.","2026-07-16","\u002Fimages\u002Fposts\u002Fmatter-thread-zigbee-explained.svg","שתי קבוצות של מכשירי בית חכם, רשת Mesh ורכזת, עם שער שמקשר בין שכבות התקשורת",[205,206,80,207],"Matter","Thread","רשת ביתית",{"path":209,"title":210,"description":211,"type":38,"level":65,"minutes":212,"date":213,"cover":214,"coverAlt":215,"featured":14,"tags":216,"topic":19},"\u002Ffullstack\u002Fbrowser-to-server-save-form","מהדפדפן לשרת: בונים טופס שמירה ורואים מה קורה בדרך","טופס HTML, בקשת POST ושרת Node.js קטן. דוגמה מלאה שממחישה איך נתונים עוברים ואיפה בודקים אותם.",9,"2026-07-11","\u002Fimages\u002Fposts\u002Fbrowser-to-server-save-form.svg","טופס בדפדפן שולח מעטפת נתונים לשרת ומשם למסד הנתונים",[182,217,184,183],"Node.js",{"path":219,"title":220,"description":221,"type":8,"level":65,"minutes":95,"date":222,"cover":223,"coverAlt":224,"featured":225,"tags":226,"topic":33},"\u002Fai\u002Fai-agent-from-request-to-result","סוכן AI: מה קורה בין הבקשה לתוצאה","איך מודל שפה משתמש בכלים, מה ההבדל בין סוכן לתהליך קבוע ואיך מגדירים משימה שאפשר לבדוק.","2026-07-06","\u002Fimages\u002Fposts\u002Fai-agent-from-request-to-result.svg","בקשה עוברת דרך מנגנון בחירה לכלי חיפוש, מסמכים וביצוע, עד לתוצאה שנבדקה",true,[29,31,227,89],"Tool Calling",{"path":229,"title":230,"description":231,"type":38,"level":65,"minutes":232,"date":233,"cover":234,"coverAlt":235,"featured":14,"tags":236,"topic":60},"\u002Fsmart-home\u002Fsmart-home-first-steps-home-assistant","בית חכם מתחילים בצעד קטן: בחירת ציוד והתקנת Home Assistant","מה צריך לבית חכם ראשון, איך בוחרים בין Home Assistant OS ל-Container, ואיך מתקינים על Raspberry Pi, מחשב, מכונה וירטואלית או NAS.",24,"2026-07-01","\u002Fimages\u002Fposts\u002Fsmart-home-first-steps-home-assistant.svg","בית עם חיישן ותאורה, המחובר לשרת Home Assistant ולשתי אפשרויות התקנה: מערכת הפעלה וקונטיינר",[56,59,237,58,238,89],"התקנה","Raspberry Pi",{"id":240,"title":6,"body":241,"cover":12,"coverAlt":13,"date":11,"description":7,"draft":14,"extension":1034,"featured":14,"level":9,"meta":1035,"minutes":10,"navigation":225,"ogImage":1036,"path":5,"seo":1037,"sitemap":1038,"stem":1039,"tags":1040,"type":8,"updated":1041,"__hash__":1042},"posts\u002Ffullstack\u002Fnuxt-4-6-whats-new.md",{"type":242,"value":243,"toc":1024},"minimark",[244,248,259,264,267,320,323,352,363,367,374,401,569,572,617,623,627,650,653,656,703,707,714,725,745,752,756,759,792,795,864,868,871,918,934,948,952,955,1001,1005,1009,1020],[245,246,247],"p",{},"Nuxt 4.6 יצא יחד עם גרסה 4 של ה־CLI, ויש בו יותר שינויים ממה שמצופה מגרסה משנית. רובם שקטים: הם לא ישברו לכם כלום ביום השדרוג, אבל הם מכינים את הקרקע ל־Nuxt 5. במקום לעבור על הכול לפי הסדר, ריכזתי כאן את מה שלדעתי משנה בעבודה היומיומית, את מה ששווה רק להכיר, ואת המקומות שבהם השדרוג דורש תשומת לב.",[245,249,250,251,258],{},"הפוסט מבוסס על ",[252,253,257],"a",{"href":254,"rel":255},"https:\u002F\u002Fnuxt.com\u002Fblog\u002Fv4-6",[256],"nofollow","הכרזת הגרסה בבלוג של Nuxt",". שם תמצאו את הרשימה המלאה, כולל המספרים וכל השינויים לכותבי מודולים. הבלוג הזה עצמו בנוי על Nuxt 4, אז חלק מהדוגמאות לקוחות ישירות מהקוד שלו.",[260,261,263],"h2",{"id":262},"לפני-שמשדרגים-node-והcli","לפני שמשדרגים: Node וה־CLI",[245,265,266],{},"שני שינויים יכולים לעצור את השדרוג עוד לפני שהקוד שלכם רץ:",[268,269,270,302],"ul",{},[271,272,273,277,278,282,283,286,287,290,291,294,295,298,299,301],"li",{},[274,275,276],"strong",{},"גרסת Node."," הגרסה החדשה דורשת ",[279,280,281],"code",{},"^22.22.3",", ",[279,284,285],{},"^24.15.0"," או ",[279,288,289],{},"26"," ומעלה. אם הפרויקט מקובע לגרסה ישנה יותר ב־",[279,292,293],{},".nvmrc",", ב־",[279,296,297],{},"Dockerfile"," או ב־CI, עדכנו אותה קודם. כאן ",[279,300,293],{}," מצביע על 24.21, כך שאין בעיה.",[271,303,304,307,308,311,312,315,316,319],{},[274,305,306],{},"ה־CLI החדש."," ",[279,309,310],{},"nuxt init"," הוסר, ופרויקט חדש פותחים עם ",[279,313,314],{},"npm create nuxt@latest",". התמיכה ב־Nuxt 2 וב־",[279,317,318],{},"@nuxt\u002Fbridge"," ירדה מה־CLI.",[245,321,322],{},"השדרוג עצמו הוא פקודה אחת:",[324,325,330],"pre",{"className":326,"code":327,"language":328,"meta":329,"style":329},"language-bash shiki shiki-themes github-dark-contrast","npx nuxt upgrade --dedupe\n","bash","",[279,331,332],{"__ignoreMap":329},[333,334,337,341,345,348],"span",{"class":335,"line":336},"line",1,[333,338,340],{"class":339},"svObZ","npx",[333,342,344],{"class":343},"sU2Wk"," nuxt",[333,346,347],{"class":343}," upgrade",[333,349,351],{"class":350},"sDLfK"," --dedupe\n",[245,353,354,355,358,359,362],{},"הדגל ",[279,356,357],{},"--dedupe"," מרענן את קובץ הנעילה, כדי שלא יישארו בו עותקים ישנים של חבילות פנימיות לצד החדשות. אחרי זה הריצו את הבדיקות ואת ",[279,360,361],{},"typecheck"," לפני כל דבר אחר.",[260,364,366],{"id":365},"nuxtserver-קוד-שרת-שלא-תלוי-בגרסת-h3","nuxt\u002Fserver: קוד שרת שלא תלוי בגרסת h3",[245,368,369,370,373],{},"זה השינוי שהכי מעניין אותי, כי הוא פותר בעיה שנתקלתי בה בבלוג הזה. Nuxt רץ היום על Nitro 2 ו־h3 1, אבל כלי פיתוח מושכים כבר את h3 2. התוצאה הייתה שבלי לקבע את h3 1 כתלות ישירה ב־",[279,371,372],{},"package.json",", TypeScript התחיל לקרוא את הטיפוסים של הגרסה הלא נכונה. כל קוד שרת שכתוב ישירות מול h3 קשור לגרסה מסוימת שלו.",[245,375,376,377,380,381,282,384,282,387,282,390,282,393,396,397,400],{},"Nuxt 4.6 מוסיף שכבה משלו: ",[279,378,379],{},"nuxt\u002Fserver",". היא מייצאת את הפונקציות המוכרות (",[279,382,383],{},"defineEventHandler",[279,385,386],{},"getQuery",[279,388,389],{},"getRouterParam",[279,391,392],{},"readValidatedBody",[279,394,395],{},"createError"," ועוד) עם אובייקט ",[279,398,399],{},"RequestEvent"," אחיד, ואותו handler אמור לעבוד על Nitro 2, על Nitro 3 ועל בונה השרת הניסיוני מבוסס Vite.",[324,402,406],{"className":403,"code":404,"language":405,"meta":329,"style":329},"language-ts shiki shiki-themes github-dark-contrast","\u002F\u002F server\u002Fapi\u002Fposts\u002F[slug].get.ts\nimport { createError, defineEventHandler, getRouterParam } from 'nuxt\u002Fserver'\n\nexport default defineEventHandler(async (event) => {\n  const slug = getRouterParam(event, 'slug')\n  const post = await findPost(slug)\n  if (!post) {\n    throw createError({ status: 404, statusText: 'Post not found' })\n  }\n  return post\n})\n","ts",[279,407,408,414,431,437,471,495,514,527,550,555,564],{"__ignoreMap":329},[333,409,410],{"class":335,"line":336},[333,411,413],{"class":412},"sQBQX","\u002F\u002F server\u002Fapi\u002Fposts\u002F[slug].get.ts\n",[333,415,417,421,425,428],{"class":335,"line":416},2,[333,418,420],{"class":419},"snl16","import",[333,422,424],{"class":423},"s95oV"," { createError, defineEventHandler, getRouterParam } ",[333,426,427],{"class":419},"from",[333,429,430],{"class":343}," 'nuxt\u002Fserver'\n",[333,432,434],{"class":335,"line":433},3,[333,435,436],{"emptyLinePlaceholder":225},"\n",[333,438,440,443,446,449,452,455,458,462,465,468],{"class":335,"line":439},4,[333,441,442],{"class":419},"export",[333,444,445],{"class":419}," default",[333,447,448],{"class":339}," defineEventHandler",[333,450,451],{"class":423},"(",[333,453,454],{"class":419},"async",[333,456,457],{"class":423}," (",[333,459,461],{"class":460},"s9osk","event",[333,463,464],{"class":423},") ",[333,466,467],{"class":419},"=>",[333,469,470],{"class":423}," {\n",[333,472,474,477,480,483,486,489,492],{"class":335,"line":473},5,[333,475,476],{"class":419},"  const",[333,478,479],{"class":350}," slug",[333,481,482],{"class":419}," =",[333,484,485],{"class":339}," getRouterParam",[333,487,488],{"class":423},"(event, ",[333,490,491],{"class":343},"'slug'",[333,493,494],{"class":423},")\n",[333,496,498,500,503,505,508,511],{"class":335,"line":497},6,[333,499,476],{"class":419},[333,501,502],{"class":350}," post",[333,504,482],{"class":419},[333,506,507],{"class":419}," await",[333,509,510],{"class":339}," findPost",[333,512,513],{"class":423},"(slug)\n",[333,515,516,519,521,524],{"class":335,"line":95},[333,517,518],{"class":419},"  if",[333,520,457],{"class":423},[333,522,523],{"class":419},"!",[333,525,526],{"class":423},"post) {\n",[333,528,529,532,535,538,541,544,547],{"class":335,"line":24},[333,530,531],{"class":419},"    throw",[333,533,534],{"class":339}," createError",[333,536,537],{"class":423},"({ status: ",[333,539,540],{"class":350},"404",[333,542,543],{"class":423},", statusText: ",[333,545,546],{"class":343},"'Post not found'",[333,548,549],{"class":423}," })\n",[333,551,552],{"class":335,"line":212},[333,553,554],{"class":423},"  }\n",[333,556,558,561],{"class":335,"line":557},10,[333,559,560],{"class":419},"  return",[333,562,563],{"class":423}," post\n",[333,565,566],{"class":335,"line":10},[333,567,568],{"class":423},"})\n",[245,570,571],{},"שלוש מלכודות שכדאי להכיר לפני שמעבירים קוד:",[268,573,574,587,605],{},[271,575,576,579,580,582,583,586],{},[274,577,578],{},"האימפורט המפורש הוא העיקר."," הפונקציות שמגיעות דרך auto-import עדיין משתמשות בטיפוסים של h3. כדי לקבל את ה־API החדש צריך לייבא מ־",[279,581,379],{}," במפורש, וערבוב של שני הסוגים באותו קובץ מסתיים בשגיאה ",[279,584,585],{},"NUXT_E8012",".",[271,588,589,307,594,597,598,601,602,586],{},[274,590,591,593],{},[279,592,395],{}," מקבל שמות שדות אחרים:",[279,595,596],{},"status"," ו־",[279,599,600],{},"statusText",", כמו ב־",[252,603,604],{"href":175},"Fetch API",[271,606,607,613,614,586],{},[274,608,609,612],{},[279,610,611],{},"sendRedirect"," מחזיר תשובה"," במקום לשלוח אותה בעצמו, וכותרות קובעים דרך ",[279,615,616],{},"event.res.headers",[245,618,619,620,622],{},"אין חובה לעבור עכשיו. אבל קוד שרת חדש כדאי כבר לכתוב מול ",[279,621,379],{},", כדי שהמעבר ל־Nitro 3 לא יהיה פרויקט בפני עצמו.",[260,624,626],{"id":625},"fetch-שבאמת-בודק-את-הבקשה","$fetch שבאמת בודק את הבקשה",[245,628,629,632,633,636,637,282,640,597,643,646,647,649],{},[279,630,631],{},"$fetch"," ב־Nuxt ידע כבר קודם להסיק את סוג התשובה מנתיב ה־API. הגרסה החדשה בונה את המנגנון מחדש, עם מהדר בשם ",[279,634,635],{},"fetchdts",", ובודקת גם את מה ששולחים: ",[279,638,639],{},"body",[279,641,642],{},"query",[279,644,645],{},"headers"," נבדקים מול ההגדרה של ה־handler בשרת. אם שיניתם שדה בצד השרת ושכחתם את הלקוח, ",[279,648,361],{}," יתפוס את זה.",[245,651,652],{},"בונוס פחות נוצץ אבל חשוב: לפי צוות Nuxt, בפרויקט עם 300 נתיבים מספר הטיפוסים ש־TypeScript צריך לחשב יורד ממיליונים לעשרות אלפים. בפרויקטים גדולים זה ההבדל בין עורך שמגיב מיד לבין עורך שחושב.",[245,654,655],{},"ב־Nuxt 4 זה עדיין בהפעלה ידנית (ב־Nuxt 5 זו תהיה ברירת המחדל):",[324,657,659],{"className":403,"code":658,"language":405,"meta":329,"style":329},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  experimental: {\n    routeTypedFetch: true,\n  },\n})\n",[279,660,661,666,678,683,694,699],{"__ignoreMap":329},[333,662,663],{"class":335,"line":336},[333,664,665],{"class":412},"\u002F\u002F nuxt.config.ts\n",[333,667,668,670,672,675],{"class":335,"line":416},[333,669,442],{"class":419},[333,671,445],{"class":419},[333,673,674],{"class":339}," defineNuxtConfig",[333,676,677],{"class":423},"({\n",[333,679,680],{"class":335,"line":433},[333,681,682],{"class":423},"  experimental: {\n",[333,684,685,688,691],{"class":335,"line":439},[333,686,687],{"class":423},"    routeTypedFetch: ",[333,689,690],{"class":350},"true",[333,692,693],{"class":423},",\n",[333,695,696],{"class":335,"line":473},[333,697,698],{"class":423},"  },\n",[333,700,701],{"class":335,"line":497},[333,702,568],{"class":423},[260,704,706],{"id":705},"סשנים-מובנים-וappsecret","סשנים מובנים ו־appSecret",[245,708,709,710,713],{},"עד עכשיו, סשן מבוסס cookie ב־Nuxt דרש מודול חיצוני או קוד ידני מול h3. עכשיו יש ",[279,711,712],{},"useSession()"," מובנה, ששומר את המידע ב־cookie חתום ומוצפן, בלי מסד נתונים בצד השרת.",[245,715,716,717,720,721,724],{},"הוא נשען על הגדרה חדשה, ",[279,718,719],{},"runtimeConfig.appSecret",", שמגיעה ממשתנה הסביבה ",[279,722,723],{},"NUXT_APP_SECRET",":",[324,726,728],{"className":326,"code":727,"language":328,"meta":329,"style":329},"# .env (never commit the real value)\nNUXT_APP_SECRET=a-long-random-string-of-at-least-32-characters\n",[279,729,730,735],{"__ignoreMap":329},[333,731,732],{"class":335,"line":336},[333,733,734],{"class":412},"# .env (never commit the real value)\n",[333,736,737,739,742],{"class":335,"line":416},[333,738,723],{"class":423},[333,740,741],{"class":419},"=",[333,743,744],{"class":343},"a-long-random-string-of-at-least-32-characters\n",[245,746,747,748,751],{},"הסוד הזה הוא מה שמונע מגולש לזייף cookie, ולכן הוא שייך לסביבת הייצור ולא למאגר הקוד. מודולים יכולים לגזור ממנו סודות משלהם עם ",[279,749,750],{},"deriveSecret(purpose)",", כך שאין צורך להגדיר סוד נפרד לכל מודול.",[260,753,755],{"id":754},"חוויית-פיתוח-cli-שגיאות-ודפי-טעינה","חוויית פיתוח: CLI, שגיאות ודפי טעינה",[245,757,758],{},"אלה השינויים שתרגישו בדקה הראשונה אחרי השדרוג:",[268,760,761,770,780,786],{},[271,762,763,769],{},[274,764,765,768],{},[279,766,767],{},"nuxt dev"," מציג פאנל אינטראקטיבי"," בטרמינל: הכתובות, התקדמות העלייה, וקיצורים של מקש אחד.",[271,771,772,775,776,779],{},[274,773,774],{},"שגיאות בזמן פיתוח"," מוצגות בשכבה חדשה, עם stack trace שממופה לקבצי המקור וקטע הקוד הרלוונטי. יש כפתור ״Copy error״, שימושי במיוחד כשמדביקים שגיאה לעוזר AI. גם שגיאת תחביר ב־",[279,777,778],{},"nuxt.config.ts"," מוצגת עכשיו כדף, שנטען מחדש כשמתקנים.",[271,781,782,785],{},[274,783,784],{},"דף טעינה ודפי שגיאה חדשים",", כולל 404 מעוצב מחדש.",[271,787,788,791],{},[274,789,790],{},"ה־CLI קטן ומהיר יותר:"," לפי ההכרזה, ההתקנה קטנה בכ־70% והמסך הראשון מופיע מהר פי כמה.",[245,793,794],{},"הקיצורים בפאנל:",[796,797,798,811],"table",{},[799,800,801],"thead",{},[802,803,804,808],"tr",{},[805,806,807],"th",{},"מקש",[805,809,810],{},"מה הוא עושה",[812,813,814,825,835,845,855],"tbody",{},[802,815,816,822],{},[817,818,819],"td",{},[279,820,821],{},"r",[817,823,824],{},"הפעלה מחדש של שרת הפיתוח",[802,826,827,832],{},[817,828,829],{},[279,830,831],{},"o",[817,833,834],{},"פתיחת האתר בדפדפן",[802,836,837,842],{},[817,838,839],{},[279,840,841],{},"l",[817,843,844],{},"הצגת הלוגים",[802,846,847,852],{},[817,848,849],{},[279,850,851],{},"n",[817,853,854],{},"הצגת הבקשות שהגיעו לשרת",[802,856,857,861],{},[817,858,859],{},[279,860,245],{},[817,862,863],{},"הצגת הדפים באפליקציה",[260,865,867],{"id":866},"ביצועים-וpayload-קל-יותר","ביצועים ו־payload קל יותר",[245,869,870],{},"כמה שיפורים עובדים בלי שתעשו כלום, וכמה דורשים הפעלה:",[268,872,873,886,894,902],{},[271,874,875,885],{},[274,876,877,880,881,884],{},[279,878,879],{},"\u003CNuxtLink>"," מתרנדר בשרת כ־",[279,882,883],{},"\u003Ca>"," פשוט."," לפי ההכרזה, זה לבד מעלה את קצב ה־SSR בכרבע.",[271,887,888,893],{},[274,889,890],{},[279,891,892],{},"useCookie"," מפענח את ה־cookies פעם אחת לכל בקשה, ו־cookie שנקבע במהלך ה־SSR נקרא נכון בקריאות הבאות.",[271,895,896,901],{},[274,897,898],{},[279,899,900],{},"experimental.early404"," מחזיר 404 לנתיב שלא קיים בלי ליצור בכלל את אפליקציית Vue. שימושי מול בוטים שסורקים כתובות אקראיות.",[271,903,904,909,910,913,914,917],{},[274,905,906],{},[279,907,908],{},"serialize: false"," ב־",[279,911,912],{},"useFetch"," וב־",[279,915,916],{},"useAsyncData"," משאיר נתונים מחוץ ל־payload, כשאין צורך בהם בצד הלקוח. בזמן פיתוח תקבלו גם אזהרה כשה־payload עובר 100kB.",[245,919,920,921,923,924,926,927,597,930,933],{},"ויש גם יכולת חדשה לבנות ״תוספים״ ל־",[279,922,912],{}," ול־",[279,925,916],{},", עם ",[279,928,929],{},"defineUseFetchAddon",[279,931,932],{},"defineUseAsyncDataAddon",": התנהגות כמו רענון כשהחלון חוזר לפוקוס, polling או ניסיון חוזר, שמגדירים פעם אחת ומשתמשים בה בכל מקום.",[245,935,936,937,940,941,944,945,947],{},"לאתר סטטי כמו הבלוג הזה, הדבר המעניין ביותר הוא ",[279,938,939],{},"experimental.prerenderErrorPages",": הוא מייצר בזמן הבנייה קובץ ",[279,942,943],{},"404.html"," אמיתי. כאן nginx כבר מגיש ",[279,946,943],{}," עם סטטוס 404, אז זה מקום שאבדוק בשדרוג.",[260,949,951],{"id":950},"ניסויים-מה-שווה-להכיר-לא-להפעיל-בייצור","ניסויים: מה שווה להכיר, לא להפעיל בייצור",[245,953,954],{},"שלושה דברים בגרסה מסומנים בבירור כניסיוניים. שווה לנסות אותם בענף צדדי, לא בפרויקט של לקוח:",[268,956,957,975,988],{},[271,958,959,962,963,966,967,970,971,974],{},[274,960,961],{},"Vue Vapor."," מצב קומפילציה של Vue בלי Virtual DOM. ב־Nuxt 4.6 מפעילים אותו עם ",[279,964,965],{},"vue.vapor: true",", ואז כל קומפוננטה בוחרת בעצמה, עם ",[279,968,969],{},"\u003Cscript setup vapor>",". דורש Vue ",[279,972,973],{},"3.6"," בגרסת RC.",[271,976,977,457,980,983,984,987],{},[274,978,979],{},"בונה שרת מבוסס Vite",[279,981,982],{},"@nuxt\u002Fvite-server","), שמופעל עם ",[279,985,986],{},"server.builder: 'vite'",". הוא תומך ב־SPA, ב־SSR עם Node, ב־handlers בסגנון Fetch (Cloudflare, Netlify) ובבנייה סטטית, אבל בלי חלק מהיכולות של Nitro, כמו storage ו־tasks.",[271,989,990,993,994,997,998,1000],{},[274,991,992],{},"תצוגה מקדימה של Nuxt 5"," עם ",[279,995,996],{},"future.compatibilityVersion: 5",". זה מפעיל בבת אחת דפים עם טיפוסים, ",[279,999,631],{}," עם טיפוסים, ניתוב רגיש לאותיות גדולות וקטנות, וכמה שינויים נוספים. זו הדרך הטובה ביותר לגלות מה יישבר במעבר ל־Nuxt 5, כל עוד יש זמן לתקן.",[260,1002,1004],{"id":1003},"אם-הייתי-משדרג-היום","אם הייתי משדרג היום",[1006,1007],"process",{":steps":1008},"[{\"title\":\"Node קודם\",\"text\":\"בדקו את גרסת Node ב־.nvmrc, ב־Dockerfile וב־CI, ועדכנו אם צריך.\"},{\"title\":\"שדרוג ובדיקות\",\"text\":\"npx nuxt upgrade --dedupe, ואחריו test, typecheck ובנייה מלאה.\"},{\"title\":\"קוד שרת חדש\",\"text\":\"handlers חדשים נכתבים מול nuxt\u002Fserver, עם אימפורט מפורש.\"},{\"title\":\"ענף לניסויים\",\"text\":\"routeTypedFetch ו־compatibilityVersion 5 בענף צדדי, כדי לראות מה Nuxt 5 ידרוש.\"}]",[1010,1011,1013],"note",{"title":1012},"מקור",[245,1014,250,1015,1019],{},[252,1016,1018],{"href":254,"rel":1017},[256],"הכרזת Nuxt 4.6"," בבלוג של Nuxt. הבחירה, הסדר, הדוגמאות וההמלצות הם שלי. לרשימה המלאה של השינויים, ובמיוחד לכותבי מודולים, כדאי לקרוא את ההכרזה ואת מדריך השדרוג.",[1021,1022,1023],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sQBQX, html code.shiki .sQBQX{--shiki-default:#959DA5}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":329,"searchDepth":416,"depth":416,"links":1025},[1026,1027,1028,1029,1030,1031,1032,1033],{"id":262,"depth":416,"text":263},{"id":365,"depth":416,"text":366},{"id":625,"depth":416,"text":626},{"id":705,"depth":416,"text":706},{"id":754,"depth":416,"text":755},{"id":866,"depth":416,"text":867},{"id":950,"depth":416,"text":951},{"id":1003,"depth":416,"text":1004},"md",{},"\u002Fimages\u002Fposts\u002Fnuxt-4-6-whats-new.png",{"title":6,"description":7},{"loc":5},"fullstack\u002Fnuxt-4-6-whats-new",[16,17,18],null,"aeWfPmz8EMIciLoGc01wjCf7Pw-EJPWadQc6cShA2NM",1791281307975]