MERN栈React项目突发9个webpack编译错误如何排查
问题描述
- 基于MERN栈开发React项目时前期运行正常,编写从MongoDB读取数据的函数过程中使用了
JSON.parse,点击保存后突然出现9个编译报错。删除所有相关代码、完全回退到该段逻辑编写前的状态后,报错依然存在。 - 报错均为模块解析失败:无法在客户端client目录的
node_modules对应依赖路径下找到crypto、fs、zlib、http、querystring等Node.js核心模块,报错涉及cookie-signature、destroy、etag、express、mime、send等依赖包。 - 报错提示明确说明:webpack 5不再默认内置Node.js核心模块的polyfill,需要手动配置对应polyfill或设置fallback忽略相关模块。
项目package.json配置如下:
{ "name": "micro-reactor", "version": "0.1.0", "private": true, "proxy": "http://127.0.0.1:5000/", "dependencies": { "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^13.5.0", "axios": "^0.27.2", "bootstrap": "^5.1.3", "buffer": "^6.0.3", "path": "^0.12.7", "react": "^18.1.0", "react-bootstrap": "^2.4.0", "react-dom": "^18.1.0", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "stream": "^0.0.2", "web-vitals": "^2.1.4" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } }
- 因
package-lock.json文件行数过多(超3万行)未上传,本次为重新发布的问题帖,此前发布的帖子因功能限制无法编辑,未能补充其他用户要求的相关材料,现求可行的排查解决方向。
排查解决方向
- 优先排查依赖安装位置错误:报错涉及的
express、cookie-signature、send等包全是Node.js服务端侧依赖,本身就不应该出现在前端client目录的依赖中。大概率是写MongoDB读取逻辑时,误在client目录下执行了服务端依赖的安装命令,把后端包装进了前端依赖树。先打开client目录下的package.json,检查dependencies中是否存在express、mongodb、mongoose这类服务端包,找到后直接删除对应依赖项,再删除client目录下的node_modules文件夹和package-lock.json文件,重新执行npm install安装纯前端依赖即可。 - 排查错误导入语句:回退代码时确认有没有漏删错误的导入,全局搜索前端src目录下的所有文件,检查是否存在
require('fs')、require('http')这类直接导入Node原生模块的语句,或是误将后端server目录下的文件通过相对路径导入到了前端组件中,找到后直接删除错误导入即可。 - 不要盲目配置webpack polyfill:这类报错的核心原因是前端编译流程混入了只能在Node服务端运行的代码,不是真的缺少polyfill。就算手动给
fs、crypto等模块配了浏览器端polyfill,服务端专属的逻辑也无法在浏览器中正常运行,属于无效操作。 - 若以上操作后仍报错,检查安装的第三方包版本:确认是否误装了仅支持Node.js运行、不支持浏览器环境的包,核对包的官方说明后替换为支持浏览器端的版本即可。
内容的提问来源于stack exchange,提问作者SebR
相关产品推荐
相关产品推荐

