编译器内存溢出,请参考:https://uniapp.dcloud.net.cn/tutorial/run/OOM.html
15:02:22.720
15:02:22.720 <--- Last few GCs --->
15:02:22.720 [792:0000015BE2D56670] 91487 ms: Mark-sweep (reduce) 3047.1 (3119.1) -> 3046.9 (3119.9) MB, 1913.7 / 0.0 ms (average mu = 0.208, current mu = 0.011) allocation failure; scavenge might not succeed
15:02:22.720 [792:0000015BE2D56670] 93432 ms: Mark-sweep (reduce) 3047.9 (3119.9) -> 3047.6 (3120.4) MB, 1941.7 / 0.0 ms (average mu = 0.107, current mu = 0.002) allocation failure; scavenge might not succeed
15:02:22.720 <--- JS stacktrace --->
15:02:22.720 FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
15:02:22.892 1: 00007FF782DC5AFF node_api_throw_syntax_error+174175
15:02:22.892 2: 00007FF782D48F26 v8::internal::wasm::WasmCode::safepoint_table_offset+59926
15:02:22.892 3: 00007FF782D4ABC0 v8::internal::wasm::WasmCode::safepoint_table_offset+67248
15:02:22.892 4: 00007FF7837F6224 v8::Isolate::ReportExternalAllocationLimitReached+116
15:02:22.892 5: 00007FF7837E15B2 v8::Isolate::Exit+674
15:02:22.892 6: 00007FF78366327C v8::internal::EmbedderStackStateScope::ExplicitScopeForTesting+124
15:02:22.892 7: 00007FF78366049B v8::internal::Heap::CollectGarbage+3963
15:02:22.892 8: 00007FF7836766D3 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath+2099
15:02:22.892 9: 00007FF783676F7D v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath+93
15:02:22.892 10: 00007FF783686740 v8::internal::Factory::NewFillerObject+816
15:02:22.892 11: 00007FF783377145 v8::internal::DateCache::Weekday+1349
15:02:22.892 12: 00007FF783894121 v8::internal::SetupIsolateDelegate::SetupHeap+558257
15:02:22.892 13: 00007FF7048D9BB6
解决方式
编译器内存溢出(OOM)是一个非常典型的问题,特别是在 UniApp 从 Vue2 迁移到 Vue3 的过程中,因为 Vue3 的编译器(Vite 或 Vite-like 编译)对项目中的"大型 JS 压缩文件"扫描非常敏感。
你报错的直接原因是:你手动把 crypto-js.js(几千行的压缩 JS)放在了项目中,且在 import 时编译器试图扫描它的每一个角落,导致内存被撑爆。
以下是解决该问题的三个步骤,请按顺序执行:
第一步:彻底移除本地大文件(治本)
你之前发的那段几千行的代码,不仅导致了"未导出"报错,更是导致编译器内存溢出的罪魁祸首。
删除项目中所有的本地 JS 插件库:
pages/users/components/verify/utils/crypto-js.js
plugin/pako/pako.es5.min.js
plugin/clipboard/clipboard.js (如果有的话)
通过 npm 安装这些库。这是 Vite/Webpack 处理这类库的标准姿势,它们会被编译器优化,不会被当作纯文本扫描,从而避免内存溢出:
codeBash
npm install crypto-js pako clipboard在代码中通过 import 引用 npm 包:
import CryptoJS from 'crypto-js';
import pako from 'pako';
(Clipboard 改用 uni.setClipboardData,直接删掉 clipboard 引用)
第二步:增加 Node.js 内存限制
如果删除大文件后依然溢出,说明项目本身已经比较庞大。你需要手动增加 Node.js 编译时的内存上限。
操作方法:
如果你是用 HBuilderX 运行的项目,找到 HBuilderX 的安装目录,找到 cli 目录下的 package.json(如果找不到,请在 HBuilderX 顶部菜单选择:工具 -> 设置 -> 运行设置 -> Node 运行内存限制)。
在 HBuilderX 中直接设置 node 运行内存(如图所示,将其设为 4096 或更高):
打开 工具 -> 设置
搜索 Node 运行内存
将其调整为 4096 或 8192。
第三步:清理无用的编译缓存
在进行以上操作后,必须执行一次彻底的清理,否则旧的缓存文件会继续占用内存:
关闭 HBuilderX。
进入你的项目根目录,删除 unpackage 文件夹(这是编译生成的缓存)。
删除 node_modules 文件夹(如果是通过 npm 安装了新库,建议删除后重新 npm install)。
重新打开 HBuilderX,加载项目,重新编译。
为什么这样做可以解决?
解决扫描压力 :通过 npm install 安装的包,编译器会视其为预编译好的模块,不会深入扫描其内容,而你之前把几千行的 .js 文件放在 pages/ 下,编译器会强制尝试解析、构建依赖关系、构建 source map,这正是导致 Reached heap limit (内存溢出) 的原因。
内存优化:增加 Node.js 堆栈内存限制是处理大型 Vue3 项目(尤其是 Vite 构建时)的常用手段,因为 Vue3 的模板编译和静态分析本身就比 Vue2 更消耗内存。
现在请立即执行:
删掉那个 crypto-js.js 和 pako.es5.min.js。
运行 npm install crypto-js pako。
把代码里的 import 改成 import CryptoJS from 'crypto-js'。
清除 unpackage 目录。
重新启动项目。
这套操作做完,你的内存溢出报错和模块导出报错将同时消失。