__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 或更高版本才能使用此选项。