wrangler 的环境为什么不继承绑定?

我在配置里让 staging 环境漏写了 kv_namespaces,wrangler dev --env staging 照常启动,没有任何报错。直到请求跑到 env.CACHE.put,才抛出 Cannot read properties of undefined。

环境里的绑定类字段不可继承,每个环境必须自己写全;漏写的绑定不会在启动时失败,而是在运行时变成 undefined。

这是官方文档定下的规则:环境不是「在顶层上打补丁」,而是各自声明。下面讲哪些字段继承、哪些不继承,怎么提前发现漏写,以及 deploy 时的一个默认行为。

env 到底怎么定义和选择?

env.<name> 给同一份代码定义多套配置,用 --env staging(或 CLOUDFLARE_ENV)选择。每个环境部署成一个独立的 Worker,名字是 <name>-<env>,比如 demo-staging。这是官方文档的说法,我没有部署验证。

{
  "name": "demo",
  "main": "src/index.ts",
  "compatibility_date": "2026-10-01",
  "kv_namespaces": [{ "binding": "CACHE", "id": "<PROD_KV_ID>" }],
  "env": {
    "staging": {
      "vars": { "MODE": "staging" },
      "kv_namespaces": [{ "binding": "CACHE", "id": "<STAGING_KV_ID>" }]
    }
  }
}

哪些字段会继承,哪些不会?

name、main、compatibility_date、routes、assets 等是可继承的;vars、kv_namespaces、d1_databases、durable_objects、services、queues 等绑定类字段是不可继承的,每个环境必须自己写全。

我在本地验证的就是这条的后果:上面的配置如果 staging 里不写 kv_namespaces,启动没有问题,访问绑定时才失败。

怎么提前发现漏写的绑定?

用 wrangler types:漏写的绑定在生成的类型里是可选属性,一旦写 env.CACHE.put 类型检查就会提醒你。配合 wrangler dev 启动时的绑定清单,也能提前看出缺了什么。类型生成的细节见 Workers 的绑定是什么。

直接 wrangler deploy 会部署到哪个环境?

定义了多个环境时,直接 wrangler deploy 会部署顶层环境,wrangler 会警告未指定目标环境,建议显式传 --env,顶层环境用 --env=""。这条警告我用 --dry-run 在本地看到过。

生产环境不要依赖「不带参数 = 生产」的默认,在 CI 里写死。部署之后版本怎么流转,见 部署、版本与回滚。

临时环境该用 env 吗?

官方文档的建议是:env 适合同一份代码、少数几个长期存在的目的地,比如 dev、staging、prod;每个分支一套的临时环境不适合,应当用 Previews。我没有试过 Previews。

本地跑某个环境时变量文件怎么选,见 wrangler dev 本地和线上差在哪。

漏写 kv_namespaces 后启动正常、访问时报 Cannot read properties of undefined、wrangler types 中漏写绑定为可选属性、--dry-run 下未指定环境的警告,我在 wrangler 4.151.3(workerd 2026-10-19)的本地环境里跑过;可继承与不可继承字段的划分、<name>-<env> 的命名、CLOUDFLARE_ENV、Previews 的建议,来自 2026-10 的官方文档,我没有复现,行为会变化,以官方文档为准。本文没有执行任何会改动线上资源的命令。参考:Wrangler 环境。