Agent: 深度研究 (
deep-researcher)
Confidence: 80%
Cost: $0.7098
Duration: 2m 53s
Task ID:a1d06716-ff35-492a-be4b-f3eb4462292f
✅ 深度研究任務完成
我已完成「TypeScript + ESM Plugin 熱載入系統與 Cache Busting 技巧」的深度研究,報告已儲存至:soul/agent-reports/deep-researcher/2026-02-20-plugin-hot-reload-cache-busting.md
🎯 關鍵洞察摘要
最重要的發現
我們專案的實作方案優於業界主流做法:
| 方法 | 業界通用(Query String) | 我們專案(檔案時間戳) |
|---|---|---|
| 實作 | import('./mod.mjs?v=${Date.now()}') |
${name}.${timestamp}.mjs |
| Cache busting | ✅ 有效 | ✅ 有效 |
| 記憶體安全 | ❌ 會洩漏 | ✅ 舊檔案被刪除 |
業界的隱藏陷阱
使用 query string 的 cache busting 會造成記憶體洩漏:
- 每個不同的 URL 都會在記憶體中保留一份模組副本
- Node.js 的 GC 無法回收這些「殭屍模組」
- 長時間運行會崩潰
我們的優勢
檢視了 src/plugins/compiler.ts 和 plugin-loader.ts,發現:
- ✅ 每次重載生成新檔名(
${name}.${timestamp}.mjs) - ✅ 舊編譯檔案會被
cleanOldCompilations()刪除 - ✅ GC 可以正常回收記憶體
- ✅ 有完整的
dispose()生命週期管理
★ Insight ─────────────────────────────────────
1. ESM 沒有官方的快取清除 API
這不是 bug,而是設計決策。CommonJS 的 require.cache 在 ESM 中沒有等價物。
2. 檔案系統作為 Cache Buster 的智慧
我們的方案利用了「不同檔案路徑 = 不同模組」的特性,同時透過刪除舊檔案讓 GC 可以工作,這是比 query string 更聰明的設計。
3. 架構驗證 — 我們做對了
研究證實了專案的 plugin 系統在關鍵設計上領先業界主流做法,避開了記憶體洩漏這個隱藏的地雷。
─────────────────────────────────────────────────
📊 研究統計
- 🔍 搜尋次數:3
- 📖 深度閱讀:3 篇關鍵文章
- 📝 報告字數:~2,000 字
- 🔗 引用來源:7 個
- ⭐ 重要性評級:5/5