Vue core v3.6.0-rc.3 發布:Vapor Mode 針對 hydration 與 vdom 互通密集修補
github.com/vuejs/core releases · 2026-08-11
核心改動
v3.6.0-rc.3 於 2026-08-11 發布,commit 對齊 3adb2257,是 Vue 3.6 進入候選版後針對 Vapor Mode 的第三個修補輪。Vapor Mode 是 Vue 3.6 引入的無虛擬 DOM 編譯模式,元件會被編譯成直接操作真實 DOM 節點的指令式程式碼,跳過 vdom 的 diff 與 patch 階段;v3.6.0-rc.2(2026-07-22)已宣告其功能集與標準 vdom 模式對齊,本次 rc.3 完全是修正案,共 34 項 bug fix,沒有新功能。
本輪修補集中在 runtime-vapor,多達 24 項,主題環繞在 Vapor 元件與傳統 vdom 元件混用(即 vdom interop)時的邊界情況。例如 #15251 修正巢狀元件間快取的 props 與動態 slot 未被隔離、#15230 修正傳給元件的 class prop 未正規化、#15238 修正 Teleport target 在 scope 釋放時未清理。另有多筆針對 KeepAlive:#15189 延後分支移除到快取清理階段執行,#15190 修正被卸載的快取項目未正確移除。
- compiler-vapor(6 項):修正 v-model 產生順序在 prop effect 之後(
#15201)、cached member expression 遺失 optional chaining(#15229)、自訂指令值缺少括號包裹(#15258)等編譯輸出問題 - runtime-vapor(24 項):多筆針對非同步 hydration、Suspense、Transition 與 vdom interop 的競態與清理問題
- types(2 項):修正
defineVaporComponent誤將Exposed推斷為JSX.Element(#15242) - vapor 通用(6 項):修正具名 slot 的 fallback 內容在多個 slot root 間無法正確 resolve、slot hydration anchor 遺失標記等問題
影響範圍
這批修補的共通脈絡是混用模式下的正確性——當專案同時存在 Vapor 元件與傳統 vdom 元件(透過 vaporInteropPlugin),或在 SSR 場景下對 Vapor 元件做 hydration 時,過去版本容易出現 props 污染、slot fallback 位置錯亂、非同步 setup 期間狀態遺失等問題。多筆修正明確標註「preserve」「restore」「defer」等關鍵詞,顯示團隊正在補齊多根元件、非同步元件、fragment anchor 這幾類 hydration 邊界案例,這也是接下來把 Vapor Mode 從 beta 推向可用於 Nuxt 等 SSR 框架的必要工作。
值得留意的是上一版 v3.6.0-rc.2 帶入了一個破壞性變更:Vapor Mode 的事件委派(event delegation)從預設開啟改為預設關閉,DOM 事件監聽器直接掛在元素上以貼齊原生行為與標準 Vue 語意;若要沿用委派到 document 的行為,需在靜態事件上明確加上 .delegate 修飾符,而舊有的 compilerOptions.eventDelegation 選項已被移除:
<button @click.delegate="onClick" />對於尚未採用 Vapor Mode 的一般 Vue 專案,這輪更新不影響任何行為;但對已在 rc 通道試用 Vapor 元件、尤其搭配 vdom 元件庫或做 SSR 的專案,建議跟進到 rc.3 以取得這些 hydration 修正。
原始來源:Vue core v3.6.0-rc.3 release、CHANGELOG.md (minor branch)
Svelte 5.56.9 修正 async 模式下 controlled each 快速路徑的競態崩潰
github.com/sveltejs/svelte releases · 2026-08-12
核心改動
Svelte 於 2026-08-12 發布 5.56.9,commit 對齊 20b341f,是一個只含四項修補、不帶新功能的 patch 版本。其中最值得說明的是 #18625:修正 async 模式下 controlled、有 key 的 {#each} 區塊,在集合清空同時仍有另一個 batch 待處理時,會擲出 TypeError: Cannot read properties of undefined (reading 'e') 而中斷提交。
問題根源在編譯器內部的 pause_effects 函式。當一個 controlled each 迴圈沒有 out-transition 時,會走一條快速路徑優化直接清空 state.items;但 destroy_effects 之後會走訪還在等待中的 batch key,並嘗試存取 state.items.get(key).e,此時對應的 EachItem 已被提前清除,導致解參考失敗、整個提交流程中途中止。修法是為快速路徑加上條件:只有在 state.pending.size === 0 時才走這條路徑,讓待處理的 batch 保留它需要的 items 直到提交或捨棄完成。專案也新增了 async-each-controlled-empty-pending 測試重現雙 batch 情境。
#18625:修正 controlled each 快速路徑在有 pending batch 時提前清空 items 導致的崩潰#18636:修正屬性中的註解被重複輸出的問題#18637:修正 AST printer 未保留 CSS 註解#18638:改進 printer 內部的空白字元處理
影響範圍
這四項修補都屬於編譯器輸出與 async runtime 的正確性修正,不涉及 API 變更,一般專案升級無需調整程式碼。唯一有實際崩潰風險的是 #18625:只有同時使用 Svelte 5 的 async 特性(例如 await 於 template 中)與有 key 的 controlled {#each}、且該迴圈會在短時間內連續觸發兩個更新 batch 的場景才會踩到,一般同步渲染的元件不受影響。其餘三項屬編譯輸出的邊界修正,主要影響格式化工具與建置產物的可讀性,不影響執行期行為。