Vite SSR 报 KEY 未定义:检查带默认值的解构参数
导入的常量在普通代码中可用,放进默认解构参数的计算键却报 ReferenceError。将解构移入函数体,并核对实际 SSR 转换器。
开发中的 SSR 模块已经 import { KEY },调用函数时仍报 ReferenceError: KEY is not defined。若 KEY 出现在带默认值的解构参数中,例如 function make({ [KEY]: value } = {}),先查看服务端转换后的参数引用,不要给全局添加同名变量。
这条情况在 Vite 8.2.1 中确认,也涉及使用相关转换代码的旧版本。参数整体有默认值是关键:只有属性默认值、参数没有 = {} 的形式,不是相同的触发结构。
计算属性键不是函数的局部变量声明
下面两份模块说明输入,路径用于示例:
// data.js
export const KEY = 'k';
// make.js
import { KEY } from './data.js';
export function make({ [KEY]: value = null } = {}) {
return { [KEY]: value };
}
SSR 转换需要把导入引用改写为导入命名空间的属性访问。旧参数遍历在处理 AssignmentPattern 时,把计算键 KEY 也记成了局部绑定;后续改写因此跳过它,产物留下一个没有定义的裸标识符。源码确实有 import,并不足以保证转换后的参数仍引用它。
普通循环依赖、真正的名称遮蔽或导入路径错误也可能报未定义。保留服务端生成代码与栈,确认计算键没有被改写,再按这条路径处理。仅在浏览器构建中正常,不代表 SSR 转换一定正确。
将解构移入函数体,保持默认参数语义
暂时不能更新工具链时,可以只改这个函数:
import { KEY } from './data.js';
export function make(input = {}) {
const { [KEY]: value = null } = input;
return { [KEY]: value };
}
它保留不传参数或传 undefined 时使用空对象的行为,也保留属性缺失时的 null 默认值。原函数对显式 null 会解构失败,改写后仍会失败;不要顺便改成 input ?? {},否则会额外接受 null,改变 API 契约。
正式 Vite 8.3.5 的作用域处理已统一通过 handlePattern 递归默认参数的左侧,并仅将属性值中的绑定加入局部作用域,计算键继续作为表达式引用处理。项目兼容时可采用这类正式实现,但仍须确认框架或测试工具实际加载了哪份 Vite,不能只升级应用根目录的一份依赖。
验收覆盖省略参数、显式 undefined、缺失属性和存在属性,再覆盖原业务需要的嵌套参数、箭头函数或方法。确认 SSR 实际调用返回预期键值,生成代码引用了正确导入,同时保留合法同名局部参数的遮蔽。构建成功本身无法代替调用该函数,默认参数里的异常通常到调用时才出现。


