esbuild 报 Transforming destructuring 不支持,检查 Safari 目标
esbuild 兼容性表修正后,含 Safari 13.1 的目标可能要求尚未提供的解构降级。区分目标变更、真实转换与 supported 覆盖的风险。
构建突然报 Transforming destructuring to the configured target environment ... is not supported yet,目标列表里包含 Safari 13.1。代码没有刚增加解构,依赖更新后却开始失败时,应核对工具的兼容性表是否变了,以及它是否真的能够把解构降级到目标环境。
2026 年 4 月出现的这条变化与旧 Safari 的解构实现缺陷有关。已核对的 esbuild 0.28.1 兼容性表把 Safari 支持起点列为 14.1、iOS 为 14.5;较低目标需要降级,而这里的 esbuild 尚未提供相应解构转换。构建拒绝生成,并不等于源码刚写错了。
es2019 不能抵消更低的浏览器目标
实际错误可能类似:
Transforming destructuring to the configured target environment
("chrome87", "edge88", "es2019", "firefox78", "safari13.1")
is not supported yet
目标列表要求输出满足所有目标。即使 ES2019 本身包含解构语法,Safari 13.1 仍会对输出提出更低的兼容要求,不能因为列表里有一个较新标准就忽略它。
沿失败文件找出具体的解构表达式,并确认 esbuild 是由 Vite、Quasar、PWA 插件还是自有脚本调用。主构建和 service worker 可能使用不同目标配置;只改主应用的 target,失败的 worker 构建未必会变化。
按真实支持范围选择处理方式
产品已经不再支持旧 Safari 时,可以在对应构建入口更新目标,明确从 Safari 14.1 起处理;若同时列出 iOS,也要按实际设备范围核对,不能只改桌面 Safari 就认为移动端已满足条件。目标变更意味着支持范围调整,应由项目既有的兼容政策决定。
仍需支持旧环境时,应保留原目标,并选择确实能完成所需语法转换的已有构建流程。必要时局部改写失败表达式,但必须保留求值次数、默认值、getter 调用、迭代器及剩余项的原有含义。复杂解构不能简单逐字段复制后就视为等价。
esbuild 提供 supported 覆盖,例如配置片段:
supported: {
destructuring: true,
}
这个选项只是告诉 esbuild 允许保留解构,不会修复 Safari 的实现,也不会把解构转换成另一种写法。只有已经确认部署环境能够正确执行所需语义、原目标配置与实际范围不一致时,才有理由使用它;不能把它当成“开启降级支持”的开关。
同样,固定旧 esbuild 可能让构建暂时通过,却只是恢复旧兼容判断,不会改变真实浏览器。不要为了消除一条错误长期压住全部构建依赖,忽略其他修复。
检查失败的那份产物
保存原目标、依赖树和锁文件,再由原入口生成应用或 worker。验收除了构建成功,还要检查失败位置的最终输出,并在项目仍承诺支持的浏览器中验证相应逻辑。
若改了支持范围,发布记录应反映这次变更;若保持原范围,则需要确认采用的转换确实覆盖原语法。这个问题与 esnext 被错误映射给 Lightning CSS不同:这里是 JavaScript 的具体浏览器能力与转换缺口,不能用 CSS 目标参数修复。


