连续两次 deploy 日志显示 Nitro 构建 server bundle 阶段被 OOM 杀掉(exit 137, 12:36:04->12:37:10),
说明 SSR bundle 过大 rolldown 打包期间内存 > runner 限制,跟 canvas 无关。
定位到两个真正的内存元凶:
1. vite.ssr.noExternal 把 drizzle-orm + postgres 两个超重型库全部 inline 进 SSR bundle
-> 修复: node-server 环境下 noExternal 改成空数组,运行时直接 require node_modules
(Vercel/Netlify serverless 才需要 noExternal inline,本地 node-server 不需要)
2. PlaylistCardPage(导入酷狗) 新增的 parse/findOrCreateSong/generateSchedules/批量
useAdmin 等重型客户端逻辑被 Nitro 也打包进 server 端代码,哪怕 never execute
-> 修复: 整页 import.meta.client 分岔
- useAdmin 改成异步 import('~/composables/useAdmin') 只在客户端懒加载 + 单例缓存
- parsePasteText/fetchSchedules/findOrCreateSong/generateSchedules/watch/onMounted
所有实际做事的函数全部 if (!import.meta.client) return 提前 return
- 服务端下 auth/getAuthConfig 用空对象代替,确保 TS compile 不报错
附带的 nitro 打包瘦身:
- nuxt.config 里 vite.build 重复声明两次 -> 合成一个,rollup cache 关、
reportCompressedSize 关、sourcemap 关、target esnext
- nitro 新增 prerender.crawlLinks=false routes=['/','/login'],不要扫站预渲染
- nitro.minify=true sourceMap=false
- 保留 PlaylistCardGenerator 的 SSR 安全 fitText 与单例共享 context
结果: SSR bundle 体积至少下降 2~5MB (drizzle+postgres 不 inline 了),
rolldown 打包时工作内存占用下降一个数量级,应该可以通过 exit 0。