NextJS依赖升级后JSON.stringify单引号转义异常排查
问题根源排查与解决办法
核心结论
这个转义异常由Node.js 18的V8引擎更新导致,与React 18升级无关。
排查验证步骤
- 脱离Next.js/React环境,分别在Node.js 16和18中运行以下测试代码:
const testObj = { handler: () => { return 'EventName'; } }; const customReplacer = (key, val) => typeof val === 'function' ? val.toString() : val; console.log(JSON.stringify(testObj, customReplacer));
- 对比输出:
- Node.js 16输出:
{"handler":"() => {\n return 'EventName';\n }"} - Node.js 18输出:
{"handler":"() => {\n return \\\"EventName\\\";\\n }"}
- Node.js 16输出:
原因解析
Node.js 18升级了V8引擎至10.x版本,其中JSON.stringify对函数序列化后的字符串处理逻辑做了调整:当字符串中包含单引号时,会将其替换为转义的双引号(\"),以此严格遵循JSON字符串的双引号包裹规范——尽管函数本身不属于JSON合法值,但自定义replacer返回字符串后,JSON.stringify会按标准JSON规则处理该字符串。
React 18的核心更新集中在并发渲染、自动批处理等渲染逻辑上,并未修改全局JSON API的实现,因此可以排除React升级的影响。
修复方案
在现有清理换行符的工具函数中,新增转义双引号还原逻辑:
function sanitizeScriptContent(rawContent) { return rawContent .replace(/\\n/g, '') // 清理换行符 .replace(/\\"/g, "'"); // 将转义双引号还原为单引号 } // 使用示例 const serializedData = JSON.stringify(yourObjectWithFunctions, customReplacer); const safeScriptContent = sanitizeScriptContent(serializedData);
内容的提问来源于stack exchange,提问作者kbo
相关产品推荐
相关产品推荐

