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

基于react-multi-carousel的可复用组件跨项目集成时出现'Cannot read properties of undefined (reading 'validated')'错误排查求助

基于react-multi-carousel的可复用组件跨项目集成时出现'Cannot read properties of undefined (reading 'validated')'错误排查求助

问题描述

我正在使用react-multi-carousel开发一个可复用的React组件,但将其集成到另一个React应用时遇到了以下错误:

Cannot read properties of undefined (reading 'validated')
TypeError: Cannot read properties of undefined (reading 'validated')
    at cloneAndReplaceKey (http://localhost:3000/static/js/bundle.js:21406:49)
    at mapIntoArray (http://localhost:3000/static/js/bundle.js:21499:200)
    at mapIntoArray (http://localhost:3000/static/js/bundle.js:21504:164)
    at mapChildren (http://localhost:3000/static/js/bundle.js:21515:5)
    at Object.toArray (http://localhost:3000/static/js/bundle.js:21731:14)
    at t.default (http://localhost:3000/static/js/bundle.js:23108:218)
    at react-stack-bottom-frame (http://localhost:3000/static/js/bundle.js:17901:18)
    at renderWithHooks (http://localhost:3000/static/js/bundle.js:9218:20)
    at updateFunctionComponent (http://localhost:3000/static/js/bundle.js:10487:17)
    at beginWork (http://localhost:3000/static/js/bundle.js:11105:16)

组件代码与配置

我的可复用组件代码:

import React from 'react';
import Carousel from 'react-multi-carousel';
import 'react-multi-carousel/lib/styles.css';

const Widget1 = () => {

  const responsive = {
    superLargeDesktop: { breakpoint: { max: 4000, min: 1024 }, items: 5 },
    desktop: { breakpoint: { max: 1024, min: 768 }, items: 3 },
    tablet: { breakpoint: { max: 768, min: 464 }, items: 2 },
    mobile: { breakpoint: { max: 464, min: 0 }, items: 1 },
  };

  return (
    <Carousel responsive={responsive}>
      <div style={{ background: 'red', height: 200 }}>Item 1</div>
      <div style={{ background: 'blue', height: 200 }}>Item 2</div>
      <div style={{ background: 'green', height: 200 }}>Item 3</div>
    </Carousel>
  );
};

export default Widget1;

Webpack配置文件:

const path = require('path');

module.exports = {
  entry: './src/Widget1.js',  // Entry point: main JS file of the component
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'Widget1.js',  // Output the bundled JS file in the dist/ folder
    library: 'Widget1',      // Expose it as a global library
    libraryTarget: 'umd',        // Universal module definition (works for CommonJS, AMD, and as a global)
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,           // Match all JS/JSX files
        exclude: /node_modules/,   // Exclude node_modules
        use: {
          loader: 'babel-loader',  // Use Babel to transpile JavaScript
          options: {
            presets: [
                [
                    '@babel/preset-react',
                    {
                      runtime: 'automatic', // Enable the automatic runtime
                      importSource: '@emotion/react', // Optional: use Emotion for JSX pragmas
                    },
                ], 
                '@babel/preset-env'
            ],
          },
        },
      },
      {
        test: /\.css$/,            // Match CSS files
        use: ['style-loader', 'css-loader'],  // Use these loaders to handle CSS
      },
    ],
  },
  resolve: {
    extensions: ['.js', '.jsx'],  // Allow importing without specifying extensions
  },
  externals: {
    react: 'react',
    'react-dom': 'react-dom'
  },
  devtool: 'source-map',
  mode: 'production',             // Set mode to production for minification and optimization
};

组件消费方式

在另一个React应用中直接使用:

<Widget1 />

分析与解决方案

这个错误发生在React内部处理子元素的cloneAndReplaceKey函数中,核心原因大概率是React上下文/实例冲突或依赖管理配置不当。以下是具体的排查方向和解决方案:

1. 解决React实例冲突(最可能的原因)

你的Webpack配置仅将react和react-dom设为外部依赖,但react-multi-carousel本身依赖React,当前配置会将react-multi-carousel打包进组件包中,导致消费项目中存在两个React实例(组件包内的、消费项目自身的),进而引发React内部函数调用异常。

解决方案:调整Webpack externals配置
将react-multi-carousel也添加到externals中,让消费项目提供该依赖,避免重复打包:

// webpack.config.js
externals: {
  react: 'react',
  'react-dom': 'react-dom',
  'react-multi-carousel': 'react-multi-carousel'
},

2. 确保版本兼容性

组件项目和消费项目的React、react-dom、react-multi-carousel版本必须匹配,否则会因API差异导致错误。

  • 在两个项目中分别执行以下命令查看版本:
    npm ls react react-dom react-multi-carousel
    
  • 如果版本不一致,统一升级/降级到兼容版本(比如react-multi-carousel v2.8.0兼容React 16.8+)。

3. 修正Babel配置

你的Babel preset-react配置中指定了importSource: '@emotion/react',但如果消费项目没有集成Emotion,这会导致JSX编译逻辑与消费项目的React上下文不兼容。
解决方案:移除Emotion相关配置(如果未使用Emotion)

// babel-loader options
presets: [
  [
    '@babel/preset-react',
    {
      runtime: 'automatic' // 保留自动runtime,移除importSource
    },
  ], 
  '@babel/preset-env'
],

4. 完善Peer Dependencies声明

在组件项目的package.json中添加peerDependencies,明确要求消费项目提供兼容版本的依赖,避免版本不匹配:

"peerDependencies": {
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
  "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
  "react-multi-carousel": "^2.8.0"
},
"peerDependenciesMeta": {
  "react": { "optional": false },
  "react-dom": { "optional": false },
  "react-multi-carousel": { "optional": false }
}

5. 验证打包结果

执行组件打包后,检查dist/Widget1.js文件,确认没有包含react-multi-carousel的完整代码,仅保留对它的引用。


按照以上步骤排查后,应该能解决这个错误。如果问题仍然存在,可以尝试在消费项目中清除缓存(npm cache clean --force),重新安装依赖后再测试。

备注:内容来源于stack exchange,提问作者SubrataG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:38:12