问题描述
vue项目打包,出现无法打包的情况,报错如下
> vue-tsc --noEmit && vite build <--- Last few GCs ---> [21096:0000021FB3EE01D0] 71374 ms: Scavenge 2044.8 (2083.7) -> 2043.9 (2085.7) MB, 3.5 / 0.0 ms (average mu = 0.353, current mu = 0.477) allocation failure; [21096:0000021FB3EE01D0] 72160 ms: Mark-sweep (reduce) 2045.8 (2085.7) -> 2044.5 (2083.4) MB, 454.4 / 0.0 ms (+ 133.6 ms in 29 steps since start of marking, biggest step 5.2 ms, walltime since start of marking 610 ms) (average mu = 0.356, current mu = <--- JS stacktrace ---> FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1: 00007FF67D25D51F node_api_throw_syntax_error+175743 2: 00007FF67D1E2E66 v8::internal::wasm::WasmCode::safepoint_table_offset+59654 3: 00007FF67D1E4B72 v8::internal::wasm::WasmCode::safepoint_table_offset+67090 4: 00007FF67DC8AAB4 v8::Isolate::ReportExternalAllocationLimitReached+116 5: 00007FF67DC75E12 v8::Isolate::Exit+674 6: 00007FF67DAF7C6C v8::internal::EmbedderStackStateScope::ExplicitScopeForTesting+124 7: 00007FF67DB04F4D v8::internal::Heap::PublishPendingAllocations+1117 8: 00007FF67DB01FD7 v8::internal::Heap::PageFlagsAreConsistent+3367 9: 00007FF67DAF4707 v8::internal::Heap::CollectGarbage+2039 10: 00007FF67DB0B0C3 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath+2099 11: 00007FF67DB0B96D v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath+93 12: 00007FF67DB1B1A3 v8::internal::Factory::NewFillerObject+851 13: 00007FF67D80C285 v8::internal::DateCache::Weekday+1349 14: 00007FF67DD28051 v8::internal::SetupIsolateDelegate::SetupHeap+558193 15: 00007FF67DCADB62 v8::internal::SetupIsolateDelegate::SetupHeap+57218 16: 00007FF5FEAA42AB
查询相关错误
Scavenge 1992.5 (2065.6) -> 1970.8 (2058.0) MB, 19.2 / 0.0 ms (average mu = 0.349, current mu = 0.338) allocation failure 这是 Node.js 的垃圾回收日志,它显示了垃圾回收的一些详细信息。 Scavenge 是 Node.js V8 引擎中的一种垃圾回收机制,主要负责新生代(新创建的对象)的垃圾回收。 日志中的数字表示了垃圾回收前后的内存使用情况。例如,1992.5 (2065.6) -> 1970.8 (2058.0) MB 表示垃圾回收前,新生代使用了1992.5MB,总内存使用了2065.6MB;垃圾回收后,新生代使用了1970.8MB,总内存使用了2058.0MB。 19.2 / 0.0 ms 表示这次垃圾回收花费了19.2毫秒。 average mu = 0.349, current mu = 0.338 是关于内存使用的统计信息,mu 是 memory utilization(内存使用率)的缩写,值越接近1表示内存使用率越高。 allocation failure 表示这次垃圾回收是由于内存分配失败触发的。 如果你的应用经常出现内存分配失败,可能需要检查是否存在内存泄漏问题。
Mark-sweep 1997.1 (2071.9) -> 1964.5 (2055.3) MB, 747.7 / 0.0 ms (average mu = 0.329, current mu = 0.310) allocation failure; scavenge might not succeed 这是 Node.js 的垃圾回收日志,它显示了垃圾回收的一些详细信息。 Mark-sweep 是 Node.js V8 引擎中的一种垃圾回收机制,主要负责老生代(存活时间较长的对象)的垃圾回收。 日志中的数字表示了垃圾回收前后的内存使用情况。例如,1997.1 (2071.9) -> 1964.5 (2055.3) MB 表示垃圾回收前,老生代使用了1997.1MB,总内存使用了2071.9MB;垃圾回收后,老生代使用了1964.5MB,总内存使用了2055.3MB。 747.7 / 0.0 ms 表示这次垃圾回收花费了747.7毫秒。 average mu = 0.329, current mu = 0.310 是关于内存使用的统计信息,mu 是 memory utilization(内存使用率)的缩写,值越接近1表示内存使用率越高。 allocation failure; scavenge might not succeed 表示这次垃圾回收是由于内存分配失败触发的,而且接下来的 Scavenge 垃圾回收可能无法成功。 如果你的应用经常出现内存分配失败,可能需要检查是否存在内存泄漏问题。
解决方案
1 安装cross-env
npm install --save-dev cross-env
2 修改环境变量
在 package.json 文件中的 scripts 部分修改 build 命令,使用 cross-env 来设置环境变量: "scripts": { "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' vue-tsc --noEmit && vite build" }