更新Webpack后react-leaflet VideoOverlay.js编译遇Unexpected token错误求助
解决React项目中react-leaflet编译失败(可选链语法不支持)的问题
编译失败
./node_modules/react-leaflet/lib/VideoOverlay.js 10:25 Module parse failed: Unexpected token (10:25) You may need an appropriate loader to handle this file type. | var overlay = new LeafletVideoOverlay(url, bounds, options); | if (options.play === true) { > overlay.getElement()?.play(); | } | return createElementObject(overlay, extendContext(ctx, {项目更新Webpack后出现上述错误,已尝试删除重装依赖、更新browserslist无效,package.json配置如下:
{ "name": "frontend", "version": "0.1.0", "private": true, "dependencies": { "@types/leaflet": "^1.9.3", "@types/react": "^18.2.6", "gsap": "^3.11.5", "leaflet": "^1.9.4", "react-google-recaptcha": "^2.1.0", "react-leaflet": "^4.2.1", "react-leaflet-core": "^2.1.1", "react-leaflet-markercluster": "^3.0.0-rc1", "react-page-scroll-progress-bar": "^3.0.1", "react-scrollmagic-r18": "^1.0.3", "video-react": "^0.16.0" }, "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": [ ">0.2%", "not dead", "not op_mini all" ], "devDependencies": { "webpack": "^4.28.3" } }
问题根源
错误中的?.是ES2020的可选链操作符,你的Webpack 4环境未配置转译第三方依赖(react-leaflet)的babel规则——默认react-scripts不会处理node_modules里的代码,导致新语法无法被解析。
可行解决方案
方案1:用react-app-rewired扩展babel配置
- 安装依赖:
npm install --save-dev react-app-rewired customize-cra @babel/plugin-proposal-optional-chaining @babel/plugin-proposal-nullish-coalescing-operator - 项目根目录新建
config-overrides.js:const { override, addBabelPlugins, addExternalBabelPlugins } = require('customize-cra'); module.exports = override( // 给项目代码添加语法支持插件 addBabelPlugins( '@babel/plugin-proposal-optional-chaining', '@babel/plugin-proposal-nullish-coalescing-operator' ), // 给第三方依赖添加插件,转译react-leaflet代码 addExternalBabelPlugins( '@babel/plugin-proposal-optional-chaining', '@babel/plugin-proposal-nullish-coalescing-operator' ) ); - 修改package.json的scripts:
"scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test", "eject": "react-scripts eject" }
方案2:降级react-leaflet到兼容版本
react-leaflet 3.x版本未使用可选链语法,可直接降级适配现有环境:
npm install react-leaflet@3.2.5 react-leaflet-core@1.1.0
方案3:升级Webpack 5(适配react-scripts)
react-scripts 5.x自带Webpack 5,默认支持ES2020语法,无需额外配置:
- 卸载手动安装的Webpack(避免和react-scripts自带版本冲突):
npm uninstall webpack - 升级react-scripts:
npm install react-scripts@latest
通用收尾操作
完成上述任一方案后,执行以下步骤确保依赖环境干净:
rm -rf node_modules package-lock.json npm install
内容的提问来源于stack exchange,提问作者D333
相关产品推荐
相关产品推荐

