webpack5 导报内存溢出问题排查思路

2,282 阅读2分钟

今天解决了仓库打包的历史遗留问题: Fatal error:Ineffective mark-compacts near heap limit allocation failed - JavaScript out of memory image.png

如图所示,有一处警告和一处报错,先解决 JavaScript out of memory 这个问题

1、分析

当前 node版本 14.18.0 webpack@5.36.0 react@17.0.2

网上给出的解法:

使用NODE_OPTIONS 环境变量全局设置 max_old_space_size值来修改内存 node --max_old_space_size=8192 XXX

主要的原因是因为使用 Node 进行打包时,采用的 V8 引擎,在 Node 中通过 JavaScript 使用内存只能使用部分内存(64位系统下约为 1.4GB,32位系统下约为 0.7GB),这就是为什么我们在打包时会出现内存溢出的问题,主要还是因为默认分配的内存比较小,而我们的项目通常很大!并且 Webpack 在打包的时候也会十分的消耗资源,当超出了默认分配的大小就会出现上述的报错问题

但是问题来了

明明页面很少,为什么会溢出? 很明显的一个现象是打包很耗时,在处理某个任务,循环引用,或者文件堆积,

2、挨个检查一遍

1 用了node运行时的pollyfill? @babel/register": "^7.13.16" 在 config.js 中有一个 resolve,它指向一些外部源码(只是位于我们引入的另一个目录)。当我从构建中移除它时,使用 webpack v5 可以成功完成构建。而当我加回去时,就会出现高 CPU/内存占用并崩溃。

2 哈希值? 在使用 webpack-dev-middleware 进行开发时,不要在文件名中使用任何形式的哈希值。每次编译都会因为文件名变化而创建一个新文件。正如文件会堆积在磁盘上一样,它们也会堆积在内存中,因为 webpack-dev-middleware 会将输出文件存储在内存中。

3 几个包含大量 console.log 语句的文件? image.png 28处

4 打包多余的js文件 需要排除掉 exclude: /node_modules/

最后

Deprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: sass-lang.com/d/legacy-js…

解决:在Webpack 中启用 Sass Compiler API

sass-loader 支持 Compiler API

首先:更新 sass-loader 到 14.2.0; 其次:卸载 sass ,安装 sass-embedded. npm uninstall sass npm install -D sass-embedded 最后:在 webpack.config.js 中增加如下配置: image.png

升级css-loader 到 6.11.0

www.oddbird.net/2024/08/14/…

www.alchemy.com/blog/how-to…

就好了