前端前線 2026 年 9 月 23 日

2026-09-23 — Node.js 26.10 新增節流防抖,免裝lodash

primary=https://nodejs.org/en/blog/release/v26.10.0 primary=https://github.com/nodejs/node/pull/65899

Node.js 26.10 新增節流防抖,免裝lodash

Node.js Blog · 2026-09-22

過去在 Node.js 專案裡要做節流或防抖,得自己刻一段用 setTimeout 追蹤時間的邏輯,或是為了兩個函式安裝整包 lodash。Node.js 26.10.0 已於 2026 年 9 月 22 日發布,直接把這兩個函式做進 util 模組。同一版也在 crypto、net、sqlite 模組加了幾個小而實用的 API。

背景

手寫節流或防抖看似簡單,其實有不少邊界情況要處理:函式被呼叫的當下要不要立刻執行、呼叫途中被取消時要不要清掉待執行的呼叫、計時器要不要在下一次呼叫時重設。這些細節每個團隊各自實作一次,程式碼散落在專案各處。於是多數專案選擇安裝 lodash.throttle、lodash.debounce 這類套件來換取一致行為。

代價是多一個相依套件,也多一份需要追蹤更新與安全性修補的第三方程式碼。相依套件越多,攻擊面與版本衝突風險也跟著增加。

核心改動

PR #65899(James M Snell 提交)在 util 模組實作了 util.debounce() 與 util.throttle(),兩者都標記為 SEMVER-MINOR。debounce 的簽名是 debounce(fn, wait, options),options 可帶 signal(AbortSignal)與 leading(布林值)。throttle 的簽名則是 throttle(fn, wait, options),wait 是節流間隔的毫秒數,用來限制函式在間隔內被同時呼叫的次數。

const util = require('node:util');

const fn = util.debounce(() => console.log(123), 1000);

fn();  // 啟動計時器,若 1 秒內沒有再被呼叫,就會執行內部函式

await setTimeout(500);

fn();  // 在計時器到期前再呼叫一次,會重設計時器

// throttle 簽名與 debounce 一致,語意是「間隔內最多執行一次」
const throttled = util.throttle(sendUpdate, 200);
throttled();

同一版還有幾個相關但獨立的新增:crypto.parsePKCS12()(PR #65627,Brian Muenzenmeyer 提交)可直接解析 PKCS12 憑證格式。net.BoundSocket 現在可以透過 PR #64725(Guy Bedford 提交)送到 worker threads 與 child process。sqlite 模組經 PR #65709(Trevor Burnham 提交)修改後,綁定參數為 undefined 時會被視為 NULL。perf_hooks 也新增了 PR #65825(James M Snell 提交)的 SlidingWindowHistogram。

影響範圍

目前在 package.json 裡列著 lodash、lodash.throttle 或 lodash.debounce 的專案,可以檢查這些相依是否只是為了這兩個函式而裝。若是,就能改用內建的 util.debounce()、util.throttle() 移除一個相依套件。套件瘦身對邊緣運算或 serverless 這類對啟動時間、bundle 大小敏感的環境尤其有感。

需要解析 PKCS12(.p12/.pfx)憑證的 Node 應用,例如處理企業 mTLS 憑證或從 Windows 憑證存放區匯出的憑證,可以評估改用 crypto.parsePKCS12() 取代原本呼叫 openssl 命令列或第三方套件的作法。需要把已監聽的 socket 從主執行緒傳給 worker threads 或 child process 做負載分攤的伺服器,也該檢視 net.BoundSocket 這個新能力是否能簡化原本手動傳遞檔案描述符的程式碼。

使用 sqlite 模組並且會把 undefined 當成參數綁定的專案要特別留意:升級後 undefined 會被當成 NULL 寫入,而不是丟出例外,這屬於行為變化。建議先在測試環境跑過一輪再上正式環境。

原始來源:Node.js 26.10.0 release notes


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