案例拆解
September 6, 2026

破解 Webflow 重整失效之謎:深度剖析 TypeError: d.push is not a function 與 Finsweet 篩選器修復方案

為什麼在 Webflow 中串接 Finsweet CMS Filter 時,直接點網址載入完全正常,但按 Cmd+R 重新整理卻整頁失效?本文深入 Webflow 2026 最新模組引擎原始碼,拆解 TypeError: d.push is not a function 的微任務時序競態問題,並提供 5 行零相依的優雅防禦補丁。

Cover Image

前言:靈異的「重整即死」Bug

在為高階品牌官網開發 Insights(文章列表)時,為了提供極致的無刷新即時篩選體驗,我們通常會選用業界最成熟的 Finsweet Attributes (CMS Filter) 套件。

然而,在最新的 Webflow 專案中,我們遇到了一個極其隱蔽且詭異的前端現象:直接輸入網址並按下 Enter 時,分類篩選運作自如、文章即時過濾、動態計數器毫秒級跳動,體驗近乎完美;但只要按下鍵盤的 Cmd + R(或 F5)重新整理,整頁篩選器瞬間失去反應、點擊任何分類標籤都毫無效果,文章計數器甚至永遠卡在預設的佔位符文字。

深入底層:Chrome 控制台的崩潰堆疊追蹤

為了找出真相,我們透過無頭瀏覽器(Headless Chrome)掛載底層監聽器,直接抓取 Cmd + R 瞬間被瀏覽器拋出的未捕獲異常(Uncaught Exception)。

追蹤堆疊呈現了非常關鍵的一行錯誤:

TypeError: d.push is not a function
   at o.push (webflow.schunk.a94666f7784ede09.js:1:30384)
   at Ut (cmsfilter.js:1:5771)
   at (cmsfilter.js:1:23066)

錯誤源頭直指 Webflow 的核心執行模組 webflow.schunk.*.js!

原始碼剖析:微任務時序差(Race Condition)

我們直接將 Webflow 壓縮後的 Runtime Chunk 進行反編譯分析,找到了 o.push 的底層定義:

// Webflow 引擎核心初始化邏輯
o.push = function(e) {
 if (I) {
   f(e) && e(); // 若 Webflow 已完全就緒 (I === true),直接執行任務
   return;
 }
 d.push(e);     // 若尚未就緒,將任務塞入佇列陣列 d
}

情境 A:網址列輸入 Enter(全新網路請求)
瀏覽器發起 HTTP 請求,資源下載存在微量的網路延遲。Webflow 的核心腳本有充裕的時間完成模組加載,並將就緒旗標 I 標記為 true。當 Finsweet 稍後執行 window.Webflow.push(...) 時,直接走進 if (I) 分支,順暢執行。

情境 B:按下 Cmd + R(磁碟快取重整)
現代瀏覽器直接從記憶體/磁碟快取(Memory/Disk Cache)毫秒級讀取靜態資源。Webflow 在執行 DOM 就緒迴圈時,已經將佇列陣列 d 銷毀或清空,但在微任務佇列中尚未把 I 切換為 true。
就在這個幾微秒的時序真空期,Finsweet 載入並嘗試呼叫 window.Webflow.push(),Webflow 試圖執行 d.push(e),但因為 d 已不是陣列,立即噴出致命的 TypeError: d.push is not a function!

終極解決方案:5 行零相依的優雅防禦補丁

既然問題出在 Webflow 對 window.Webflow.push 的狀態管理漏洞,最乾淨且具備未來向下相容性的解法,就是在 <head> 中為 window.Webflow 建立一層透明的防禦代理(Proxy / Interceptor)。

<script>
 // Webflow 引擎重整補丁(修復快取重整時 d.push 崩潰問題)
 let _wf = window.Webflow || [];
 Object.defineProperty(window, 'Webflow', {
   get() { return _wf; },
   set(val) {
     _wf = val;
     if (_wf && typeof _wf === 'object') {
       const rawPush = _wf.push;
       _wf.push = function(fn) {
         try {
           return rawPush.call(_wf, fn);
         } catch (e) {
           if (typeof fn === 'function') fn();
         }
       };
     }
   },
   configurable: true
 });
</script>
<script async src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmsfilter@1/cmsfilter.js"></script>

‍

‍

前端工程的魅力往往就在於這些看似玄學、實則嚴密的時序細節。透過深入瀏覽器運作機制與底層堆疊追蹤,我們不僅徹底解決了困擾已久的重整失效問題,更為專案打造了堅不可摧的穩定性。
Tagged in
Web Development
Content Management