如何配置Webpack始终使用package.json指定的依赖版本?
你遇到的这一系列问题,核心原因确实是多个React副本加载导致的——我之前在开发React相关开源包时也碰到过类似情况,尤其是用yarn link本地依赖包时,很容易出现依赖实例不统一的问题。下面给你一套针对性的解决方案:
1. 强化Webpack的依赖别名配置
你现有的alias配置方向是对的,但可以更严谨,同时锁定react-dom和draft-js的路径,避免这些依赖也出现多副本:
// webpack.config.js const path = require('path'); module.exports = { // ...其他原有配置 resolve: { alias: { // 强制所有模块使用主项目根目录的React 'react': path.resolve(__dirname, 'node_modules/react'), // 同时锁定ReactDOM,避免跨实例问题 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'), // 顺便统一draft-js版本,解决第一个报错的版本兼容问题 'draft-js': path.resolve(__dirname, 'node_modules/draft-js') }, modules: [path.resolve(__dirname, "app"), "node_modules"], } };
这个配置会让Webpack在解析任何模块时,都优先使用主项目根目录node_modules里的这三个依赖,不管是主项目代码还是本地link的react-draft-wysiwyg包。
2. 让本地link的依赖包复用主项目的React
当你用yarn link把本地react-draft-wysiwyg链接到主项目时,这个本地包自己的node_modules里可能还存在独立的React副本,需要手动让它复用主项目的依赖:
- 先进入本地
react-draft-wysiwyg的目录,删除自身的React、ReactDOM和draft-js文件夹:
cd /path/to/your/local/react-draft-wysiwyg rm -rf node_modules/react node_modules/react-dom node_modules/draft-js
- 然后把主项目的这三个依赖链接到本地包中:
yarn link react react-dom draft-js
这样本地包在构建和运行时,就会直接使用主项目的依赖实例,而不是自己安装的版本。
3. 强制Yarn去重依赖
有时候即使配置了别名,Yarn可能还是会因为依赖树的问题安装多个版本的相同包,执行去重命令可以自动合并:
yarn dedupe
这个命令会遍历整个依赖树,把相同版本的依赖合并到同一层级,确保整个项目中只有一份React、ReactDOM和draft-js的安装。
4. 验证依赖实例是否统一
可以在主项目的入口文件中添加一段调试代码,确认React实例是否唯一:
// 主项目入口文件(比如src/index.js) import React from 'react'; // 尝试引入react-draft-wysiwyg包内的React import ReactFromWysiwyg from 'react-draft-wysiwyg/node_modules/react'; console.log('主项目React实例:', React); console.log('react-draft-wysiwyg的React实例:', ReactFromWysiwyg); console.log('是否为同一实例:', React === ReactFromWysiwyg);
如果控制台输出是否为同一实例: true,说明多副本问题已经解决;如果还是false,检查是否有其他依赖包没有遵守peer依赖规则,偷偷安装了独立的React版本。
额外提示:关于第一个报错“block is not a BlockNode”
这个错误确实是draft-js版本不兼容导致的,你调整到v0.10.4是正确的——确保主项目和本地react-draft-wysiwyg的package.json中,draft-js的peerDependencies和dependencies都指定为^0.10.4或精确的0.10.4,避免版本不一致引发的类型错误。
内容的提问来源于stack exchange,提问作者Aid19801

