__name
问题
使用 OpenNext 适配器时,Wrangler 会使用 esbuild (opens in a new tab) 处理 worker 代码,并默认启用 keep-names
(opens in a new tab) 选项。虽然这对调试通常很有帮助,但可能会与某些 Next.js 库(如 next-themes (opens in a new tab))产生冲突,这些库会将脚本转换为字符串。这是因为 esbuild
会在模块顶部引入 __name
函数,该函数可能会意外出现在生成的脚本字符串中。当这些字符串在运行时被求值时,__name
函数可能未被定义,从而导致开发者控制台中出现如下错误:
Uncaught ReferenceError: __name is not defined
💡
请注意,根据您的代码压缩设置,__name
标识符可能会被压缩,这会使得错误信息不够明确,在某些情况下可能不会直接显示 __name
。
如何解决此类问题
要解决此问题,您只需在 wrangler.jsonc
文件 (opens in a new tab)中将 keep_names
选项设置为 false
,如下例所示:
{
"$schema": "node_modules/wrangler/config-schema.json",
"main": ".open-next/worker.js",
"name": "my-app",
"keep_names": false,
/* ... */
}
这种解决方案的一个潜在缺点是,根据您的代码压缩设置,您可能会失去在调试工具中查看原始函数名称的能力。
💡
必须使用 Wrangler 版本
4.13.0
或更高版本才能使用此选项。