本文档描述了 Node.js 的 API 弃用系统,该系统用于标记 API 为已弃用、通知开发者已弃用的用法,并管理已弃用功能最终的移除。Node.js 采用系统化的方法来沟通 API 弃用,在保持向后兼容性的同时,为开发者提供清晰的迁移路径。
Node.js 使用四种不同的弃用类型,每种类型都有不同的行为和对代码的影响。
| 弃用类型 | 描述 | 警告行为 |
|---|---|---|
| 仅文档化 | 仅在 API 文档中体现 | 无运行时警告 |
| 应用程序 | 适用于非 node_modules 的代码 | 首次使用时打印警告到 stderr |
| 运行时 | 适用于所有代码 | 适用于所有代码(包括 node_modules)的警告 |
| 生命周期结束 | 功能已移除或即将移除 | 通常会导致运行时错误 |
在使用 --pending-deprecation 标志(或设置了 NODE_PENDING_DEPRECATION=1 环境变量)时,某些仅文档化的弃用可能会发出警告。
来源: lib/internal/util.js97-195 lib/util.js228-328
util.deprecate() 函数是弃用系统的核心,它包装一个函数,并在该函数首次调用时发出警告。
来源: lib/util.js228-328 lib/internal/util.js154-195
util.deprecate() 函数接受三个参数:
当一个函数被标记为弃用时:
来源: lib/util.js228-328 lib/internal/util.js154-195
Node.js 提供了多个命令行标志和进程属性来控制如何处理弃用警告。
| 标志/属性 | 描述 |
|---|---|
--no-deprecation / process.noDeprecation = true | 静默所有弃用警告 |
--throw-deprecation / process.throwDeprecation = true | 将弃用作为警告而不是错误抛出 |
--trace-deprecation / process.traceDeprecation = true | 显示带有弃用警告的堆栈跟踪 |
--pending-deprecation / NODE_PENDING_DEPRECATION=1 | 显示待定弃用的警告 |
--no-warnings | 静默所有进程警告(包括弃用警告) |
这些标志允许开发者控制其应用程序中弃用警告的可见性和影响。
来源: lib/util.js310-327 lib/internal/util.js97-127
弃用警告系统的实现主要在两个文件中:
lib/internal/util.js - 包含弃用机制的内部实现。lib/util.js - 提供弃用系统的公共 API。该系统会跟踪哪些弃用代码已经被警告过,以避免重复警告。
来源: lib/internal/util.js98-100 lib/internal/util.js104-127 lib/util.js228-328
当调用已弃用的函数时,系统会:
process.emitWarning() 发出警告。来源: lib/internal/util.js154-195 lib/util.js264-269
弃用警告利用 Node.js 的警告系统,该系统会在 `process` 对象上发出 'warning' 事件。
来源: lib/internal/process/warning.js (代码提及暗示), doc/api/process.md587-706
弃用的警告对象包含:
name: 'DeprecationWarning'message: 提供的弃用消息code: 弃用代码(如果提供)stack: 堆栈跟踪信息(使用 --trace-deprecation 时)这使得应用程序可以以编程方式监控和处理弃用警告。
可以使用 util.deprecate() 函数来标记你自己的函数为已弃用。
使用弃用系统的最佳实践:
Node.js 使用标准的弃用代码格式,以 'DEP' 开头,后跟一个四位数字(例如 'DEP0001')。每个代码对应一个特定的已弃用 API 或功能。
弃用代码及其状态的完整列表维护在 Node.js 文档中。每个条目包含:
代码绝不重复使用,即使弃用被撤销。
来源: doc/api/deprecations.md43-48 doc/api/deprecations.md52-1105
偶尔,如果计划的移除被重新考虑,弃用可能会被撤销。在这种情况下:
此过程可确保清晰度,同时保持弃用系统的完整性。
来源: doc/api/deprecations.md44-48
弃用系统已集成到 Node.js 的核心功能中。
在 Node.js 初始化期间,弃用系统会设置为尊重命令行标志和进程属性,确保它从执行开始就能正确运行。
来源: lib/internal/bootstrap/node.js341-342 lib/internal/util.js129-152
弃用系统旨在最大程度地减少性能影响:
这种设计确保了即使大量使用已弃用的 API,也不会显著影响应用程序的性能。