Next.js 13开发服务器修改代码后崩溃问题求助
Next.js v13开发服务器崩溃问题排查
我将应用升级至Next.js v13版本后,修改代码时开发服务器频繁崩溃。触发崩溃的操作很明确:删除仍被其他地方引用的函数或变量,保存后服务器直接抛出崩溃日志:
app-name | thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: NulError(208, [10, 32, 32, 27, 91, 51, 49, 109, 120, 27, 91, 48, 109, 32, 85, 110, 101, 120, 112, 101, 99, 116, 101, 100, 32, 99, 104, 97, 114, 97, 99, 116, 101, 114, 32, 39, 92, 48, 39, 10, 32, 32, 32, 32, 44, 45, 91, 27, 91, 51, 54, 59, 49, 59, 52, 109, 47, 115, 114, 118, 47, 115, 114, 99, 47, 102, 101, 97, 116, 117, 114, 101, 115, 47, 99, 111, 109, 112, 97, 110, 121, 47, 99, 111, 109, 112, 97, 110, 121, 77, 97, 110, 97, 103, 101, 114, 47, 99, 111, 109, 112, 97, 110, 121, 77, 97, 110, 97, 103, 101, 114, 46, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 116, 115, 120, 27, 91, 48, 109, 58, 57, 48, 58, 49, 93, 10, 32, 27, 91, 50, 109, 57, 48, 27, 91, 48, 109, 32, 124, 32, 32, 32, 32, 32, 60, 47, 62, 10, 32, 27, 91, 50, 109, 57, 49, 27, 91, 48, 109, 32, 124, 32, 32, 32, 41, 59, 10, 32, 27, 91, 50, 109, 57, 50, 27, 91, 48, 109, 32, 124, 32, 125, 59, 10, 32, 27, 91, 50, 109, 57, 51, 27, 91, 48, 109, 32, 124, 32, 0, 10, 32, 32, 32, 32, 58, 32, 27, 91, 51, 49, 59, 49, 109, 94, 27, 91, 48, 109, 10, 32, 32, 32, 32, 96, 45, 45, 45, 45, 10, 10, 10, 67, 97, 117, 115, 101, 100, 32, 98, 121, 58, 10, 32, 32, 32, 32, 83, 121, 110, 116, 97, 120, 32, 69, 114, 114, 111, 114, 10, 10, 83, 116, 97, 99, 107, 32, 98, 97, 99, 107, 116, 114, 97, 99, 101, 58, 10, 32, 32, 32, 48, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 49, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 50, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 51, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 52, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 53, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 54, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 55, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 56, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 32, 57, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62, 10, 32, 32, 49, 48, 58, 32, 95, 90, 90, 78, 52, 110, 111, 100, 101, 49, 52, 84, 104, 114, 101, 97, 100, 80, 111, 111, 108, 87, 111, 114, 107, 49, 50, 83, 99, 104, 101, 100, 117, 108, 101, 87, 111, 114, 107, 69, 118, 69, 78, 85, 108, 80, 57, 117, 118, 95, 119, 111, 114, 107, 95, 115, 69, 95, 52, 95, 70, 85, 78, 69, 83, 50, 95, 10, 32, 32, 49, 49, 58, 32, 119, 111, 114, 107, 101, 114, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, 116, 32, 47, 110, 111, 100, 101, 45, 118, 49, 57, 46, 53, 46, 48, 47, 111, 117, 116, 47, 46, 46, 47, 100, 101, 112, 115, 47, 117, 118, 47, 115, 114, 99, 47, 116, 104, 114, 101, 97, 100, 112, 111, 111, 108, 46, 99, 58, 49, 50, 50, 58, 5, 10, 32, 32, 49, 50, 58, 32, 60, 117, 110, 107, 110, 111, 119, 110, 62])', /root/.cargo/registry/src/github.com-1ecc6299db9ec823/napi-2.10.9/src/error.rs:322:1 app-name | stack backtrace: app-name | 0: 0xfffe6dc53898 - <unknown> app-name | 1: 0xfffe6dc78440 - <unknown> app-name | 2: 0xfffe6dc4c7c8 - <unknown> app-name | 3: 0xfffe6dc536a4 - <unknown> app-name | 4: 0xfffe6dc55310 - <unknown> app-name | 5: 0xfffe6dc55050 - <unknown> app-name | 6: 0xfffe6dc559a4 - <unknown> app-name | 7: 0xfffe6dc55784 - <unknown> app-name | 8: 0xfffe6dc53d28 - <unknown> app-name | 9: 0xfffe6dc554c8 - <unknown> app-name | 10: 0xfffe6a5f257c - <unknown> app-name | 11: 0xfffe6a5f2764 - <unknown> app-name | 12: 0xfffe6cc2fe88 - <unknown> app-name | 13: 0xfffe6a8369b4 - <unknown> app-name | 14: 0xaaaab7302b90 - _ZZN4node14ThreadPoolWork12ScheduleWorkEvENUlP9uv_work_siE0_4_FUNES2_i app-name | 15: 0xaaaab7f433ec - uv__work_done app-name | at /node-v19.5.0/out/../deps/uv/src/threadpool.c:318:5 app-name | 16: 0xaaaab7f4723c - uv__async_io app-name | at /node-v19.5.0/out/../deps/uv/src/unix/async.c:163:5 app-name | 17: 0xaaaab7f5951c - uv__io_poll app-name | at /node-v19.5.0/out/../deps/uv/src/unix/epoll.c:374:11 app-name | 18: 0xaaaab7f47c5c - uv_run app-name | at /node-v19.5.0/out/../deps/uv/src/unix/core.c:406:5 app-name | 19: 0xaaaab72778a4 - _ZN4node21SpinEventLoopInternalEPNS_11EnvironmentE app-name | 20: 0xaaaab7381b3c - _ZN4node16NodeMainInstance3RunEv app-name | 21: 0xaaaab72f821c - _ZN4node22LoadSnapshotDataAndRunEPPKNS_12SnapshotDataEPKNS_24InitializationResultImplE app-name | 22: 0xaaaab72fb1f8 - _ZN4node5StartEiPPc app-name | 23: 0xffff861ad5bc - <unknown> app-name | fatal runtime error: failed to initiate panic, error 1167804944
问题原因分析
从日志里的NulError和Rust栈回溯可以确定,问题出在napi-rs相关的原生模块处理错误信息时的空字符解析失败:
- 当代码出现未引用的变量/函数这类语法错误时,Next.js开发服务器会生成带终端控制字符(比如颜色转义符)的错误日志
- 这些错误日志里混入了空字节
0,而napi-rs在处理字符串时不允许包含空字符,代码里直接调用unwrap()处理结果,导致Rust线程panic,进而拖垮整个Node.js服务器 - 大概率和Next.js v13默认使用的SWC编译链有关,或者是项目里依赖的某个基于napi-rs的原生npm包(比如自定义SWC插件、特定lint工具)存在bug
解决建议
- 排查原生依赖:检查
package.json里是否有带napi、rust、swc-plugin标识的包,尝试更新到最新版本,或者临时移除后测试服务器是否还崩溃 - 升级Next.js版本:更新到Next.js v13的最新小版本,官方可能已经修复了SWC处理错误日志时的空字符问题
- 禁用错误美化:在
next.config.js里添加配置关闭终端错误的颜色输出,避免控制字符混入:module.exports = { compiler: { swc: { format: false, }, },
相关产品推荐
相关产品推荐

