React应用启动时报Ajv is not a constructor错误如何解决
问题定位
报错TypeError: Ajv is not a constructor的核心原因是依赖树冲突:
react-scripts@5.0.1本身已经内置了版本适配的mini-css-extract-plugin,手动在devDependencies中安装2.4.5版本后,npm会为这个手动安装的版本拉取独立的嵌套schema-utils依赖,该嵌套依赖引用的Ajv版本和项目中其他依赖提升上去的Ajv版本不兼容——嵌套的schema-utils按CommonJS规范取Ajv构造函数时,拿到的是ES Module的导出对象,无法直接用new关键字调用。- scripts中配置了
preinstall: npx npm-force-resolutions但没有在package.json中定义对应的resolutions字段,这个脚本执行时会无规则调整依赖安装位置,进一步加剧依赖树混乱。
可落地修复步骤
- 先清理现有依赖和锁文件,在项目根目录执行命令:
rm -rf node_modules package-lock.json
- 编辑package.json做两处修改:
- 删除devDependencies下的
"mini-css-extract-plugin": "2.4.5"条目,不需要手动安装这个依赖,react-scripts会自动管理适配的版本,避免版本冲突 - 删除scripts下的
"preinstall": "npx npm-force-resolutions"条目,没有配套resolutions配置时这个脚本只会破坏依赖结构
*如果你确实需要强制锁定mini-css-extract-plugin为2.4.5版本,不要直接把包装在devDependencies,而是在package.json顶层加resolutions配置,再保留preinstall脚本即可:
"resolutions": { "mini-css-extract-plugin": "2.4.5" } - 删除devDependencies下的
- 重新安装依赖:
npm install
- 依赖安装完成后执行
npm start启动项目,报错就会消失。
错误特征验证:从日志的触发路径
/app/node_modules/mini-css-extract-plugin/node_modules/schema-utils/dist/validate.js可以确认,手动安装的mini-css-extract-plugin使用了自己嵌套的schema-utils依赖,而非项目根目录的适配版本,是典型的手动安装create-react-app内置依赖导致的版本冲突问题。
内容的提问来源于stack exchange,提问作者soccerway
相关产品推荐
相关产品推荐

