前端前線 2026 年 7 月 16 日

2026-07-16 — Svelte 5.56.5 修補 effect 排程與 SSR 轉譯,WHATWG 修正 module map 永久快取失敗 fetch 的規格缺陷

primary=https://github.com/sveltejs/svelte/releases/tag/svelte%405.56.5 primary=https://github.com/whatwg/html/commit/7600b24f3e156a8c6fdabccf6c961df223835613

Svelte 5.56.5:清掉一批 effect 排程與 SSR 轉譯的邊角案例

Svelte GitHub Releases · 2026-07-14

Svelte 專案於 2026-07-14 發布 5.56.5,是 5.56.x 系列的修補版本,一次合入 11 個修正 commit。這個版本沒有新增 API,全部集中在 runes 的 effect 排程、SSR 輸出轉譯與記憶體釋放上的行為修正。多數改動源自使用者回報的邊角案例,而非既有功能的重寫。

Effect 與 derived 排程修正

其中兩個修正處理 $derived 的重新連結時機:當 derived 值只在 branch 或 root effect 內被讀取時,不應該重新建立連結#18527),另一個則是在較早的 batch 中跳過不必要的 derived effect(#18525),避免同一輪更新內重複計算。#18400 修正 derived 自身持有的 AbortSignal 在中斷連結時要一併 abort,否則舊的訂閱者可能繼續收到過期訊號。這三項都屬於 reactivity 核心排程的細節調整,會影響巢狀 effect 較深的元件樹。

SSR 輸出與樣板轉譯

#18530 修正 $state.eager() 在 SSR 輸出時的轉譯結果,#18492 則修正「declaration tag」在 SSR 過程中的轉換錯誤,兩者都是新語法在伺服器端渲染路徑上被漏掉的分支#18521 處理 {#each} keyed 區塊中,解構樣式的鍵值若本身是運算式(computed key)時未被正確轉換的問題。#18507 則修正 each 區塊內誤將 declaration tag 當成一般節點片段處理的邊角案例。

其他修正

  • #18496 清除會讓 TSGO(TypeScript 的 Go 移植版)編譯失敗的死碼
  • #18500 避免事件處理常式內誤觸發 declaration tag 警告
  • #18518 讓 preprocessor 產生的 sourcemap 串接時,改用空的 sources[0] 而非直接捨棄
  • #18541 修正 Tween 中斷後未清除 previous_task 參照導致的記憶體洩漏

原始來源:Svelte 5.56.5 Release Notes


動態 import 失敗後不再「一次死當」:WHATWG 修正 module map 快取錯誤的規格缺陷

WHATWG HTML Standard(GitHub commit)· 2026-07-15

WHATWG 在 2026-07-15 將 commit 7600b24 併入 HTML Standard,修正規格中「module map」(模組映射表)永久快取 fetch 失敗結果的行為。作者為 lucacasonato,並由 yoavweiss 共同具名,變動關閉了長年未解的 issue #6768,同時對齊 web-platform-tests 的 PR #55505。改動集中在單一規格文件,增修 37 行、刪除 18 行。

背景:module map 為什麼要快取失敗

瀏覽器在解析 import 時,會用 module map 記錄每個 specifier 對應的抓取狀態,避免同一個模組被平行 import 多次時重覆發送請求。問題在於舊規格連 fetch 失敗的結果也一併寫進 map 裡永久保存,一旦某次網路請求失敗,之後對同一個 specifier 的任何 import 都會直接沿用舊的失敗狀態,不會再嘗試抓取。這裡的「任何 import」涵蓋動態 import、動態插入的 <script type="module">,以及由它們發出的靜態 import。對仰賴 code-splitting 動態載入 chunk 的 SPA 而言,使用者只要在載入某個 lazy chunk 當下網路抖動一次,該 chunk 就會在整個頁面存活期間永久載入失敗,唯一解法是重新整理整頁。ECMAScript 規格先前已透過 tc39/ecma262 的 PR #1645 解決同樣的問題,此次 commit 是讓 HTML Standard 與其對齊。

規格改動內容

新行為下,module map 不再持久保存 HTTP 錯誤狀態:多個平行的 import 仍然只會觸發一次 fetch,若該次 fetch 失敗,所有正在等待的 import 會同時收到錯誤;但後續任何新的 import 呼叫都會對同一個 specifier 重新發起 fetch,而不是直接讀取舊的失敗紀錄。實作上,規格把原本「fetching 中的 placeholder + 永久 null 錯誤」的兩態設計,改成用一份等待中的 callback 清單追蹤所有訂閱者,fetch 完成(無論成功或失敗)時一次呼叫完所有 callback,再將 map 中的暫存項目清除,讓下次 import 能重新走一次 fetch 流程。

影響範圍

  • 受影響對象:所有實作 HTML module map 演算法的瀏覽器引擎(Chromium、Firefox、Safari 皆需跟進更新)
  • 行為改變:動態 import 失敗後,同一個 specifier 的下一次 import 會重新 fetch,不再永久回傳快取的錯誤
  • 不受影響:同一輪平行 import 仍共用同一次 fetch 結果,不會造成重複請求暴增

原始來源:WHATWG HTML commit 7600b24issue #6768


End of article
0
Would love your thoughts, please comment.x
()
x