开了 nodejs_compat,Workers 就能跑 Node 代码吗?
我在本地的 Worker 里 import "node:child_process",成功了;调用 execSync,抛出 ERR_METHOD_NOT_IMPLEMENTED。能 import,不等于能用。
**不能。nodejs_compat 只让一部分 Node API 可用,它是子集,不是 Node 运行时。**新代码应优先用 Web 标准 API,兼容层只是为了让现有的库能跑起来。
原因是 Workers 本来就不是 Node 进程,没有子进程、线程和持久磁盘。下面几个问题,是配置 nodejs_compat 时最容易搞混的地方。运行模型本身见 Workers 和传统服务器有什么不同。
nodejs_compat 开了之后,哪些 API 能用?
大量 npm 包会 import "node:buffer"、node:path、node:crypto。nodejs_compat 让一部分 Node API 可用,有的由运行时原生实现,有的是 wrangler 注入的 polyfill。官方文档说:
- 原生支持 Buffer、Crypto、Events、Path、Stream、Timers、URL、Zlib、AsyncLocalStorage 等;
- Console、DNS、OS、TLS 等是部分支持。
哪些模块能 import 却不能工作?
child_process、worker_threads、vm、http2、readline 等可以 import,但不能工作,官方称之为 non-functional stubs。按官方说法,这批 stub 模块在开启 nodejs_compat 且兼容性日期不早于各自的生效日期(2025-09-01 至 2026-03-17 之间)后才会出现。
另外,开启后 node:fs 可用,但它是内存里的虚拟文件系统,/tmp 的内容不持久,持久数据要放到 R2、KV、D1 或 Durable Objects。
什么时候需要手动写 nodejs_compat?
取决于兼容性日期:
- 日期 2026-08-04 或更晚:
nodejs_compat与nodejs_compat_v2默认开启。官方说明这些日期下不再需要写这两个标志,新配置里省略即可,已有项目不必删除;想完全关闭,要写no_nodejs_compat与no_nodejs_compat_v2。 - 日期在 2024-09-23 至 2026-08-03 之间:需要手动加
nodejs_compat。 - 更早的日期:要再加
nodejs_compat_v2才是 v2 行为。 - 日期早于 2026-08-04 且没有该标志:
node:*模块整体上不可用。少数能力有独立标志,例如nodejs_als只开启AsyncLocalStorage。
wrangler 配置里这些标志写在哪,见 wrangler 与绑定。
我在本地试出了什么?
我用 wrangler 4.151.3 做了对照:
- 兼容性日期 2026-10-01、不写任何标志:
node:buffer、node:path正常;node:child_process能 import,调用execSync抛ERR_METHOD_NOT_IMPLEMENTED。 - 兼容性日期 2026-07-01、不写标志:
wrangler dev启动时提示可能需要nodejs_compat,请求时报No such module "node:buffer"。 - 同一日期 2026-07-01 加上
nodejs_compat:行为与第 1 组相同。
结论是“不带标志时 node:* 能不能用”取决于兼容性日期。显式写上 nodejs_compat 对新旧日期都成立,只是 2026-08-04 之后多余。
新代码该用什么?
优先用 Web 标准 API:fetch、crypto.subtle、URL、Web Streams。依赖原生模块、子进程或本地文件的包,不会因为开了 nodejs_compat 就可用,而且 polyfill 会增加包体积。
兼容性日期与标志的对应关系、各模块的支持程度和 stub 生效日期来自官方文档;上面三组对照在本地 wrangler 4.151.3 的 wrangler dev 上跑过,没有在线上复现。限额与行为以 2026-10 官方文档为准,会变化。