You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Webpack始终使用package.json指定的依赖版本?

解决react-draft-wysiwyg开发中多React副本引发的Webpack错误

你遇到的这一系列问题,核心原因确实是多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:11:25