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

将组件库bundle导入React项目时出现‘React is not defined’错误求助

解决React组件库在Electron-Renderer中"React is not defined"的问题

1. 修正externals配置格式

当前externals的写法不符合UMD规范要求,需改为多规范兼容的对象式配置,确保Electron-Renderer环境能正确识别不同模块规范下的React导出:

externals: {
  react: {
    root: 'React',
    commonjs: 'react',
    commonjs2: 'react',
    amd: 'react',
    umd: 'react'
  },
  'react-dom': {
    root: 'ReactDOM',
    commonjs: 'react-dom',
    commonjs2: 'react-dom',
    amd: 'react-dom',
    umd: 'react-dom'
  }
}

2. 调整JSX运行时配置

通过配置Babel或TypeScript的自动JSX运行时,避免手动导入React的缺失问题:

  • Babel配置(.babelrc或babel.config.json):
{
  "presets": [
    ["@babel/preset-react", { "runtime": "automatic" }]
  ]
}
  • TypeScript配置(tsconfig.json):
{
  "compilerOptions": {
    "jsx": "react-jsx"
  }
}

3. 完善Webpack Output配置

补充库名称、导出规则并修复全局对象绑定问题:

output: {
  path: path.resolve(__dirname, 'dist'),
  filename: 'testing.js',
  library: 'TestingComponent',
  libraryTarget: 'umd',
  libraryExport: 'default', // 组件为默认导出时开启
  globalObject: 'this' // 适配Electron中window/global的全局对象差异
}

4. 适配Electron渲染进程的上下文隔离

若Electron开启了contextIsolation: true,需通过预加载脚本暴露React到全局上下文:

  • 预加载脚本(preload.js):
const { contextBridge } = require('electron');
const React = require('react');
const ReactDOM = require('react-dom');

contextBridge.exposeInMainWorld('React', React);
contextBridge.exposeInMainWorld('ReactDOM', ReactDOM);
  • 主进程BrowserWindow配置:
new BrowserWindow({
  webPreferences: {
    preload: path.join(__dirname, 'preload.js'),
    contextIsolation: true,
    nodeIntegration: false
  }
});

5. 验证组件库入口的导出逻辑

确保组件库入口文件正确导出组件,若使用旧版JSX运行时需手动导入React:

import React from 'react';
export const TestComponent = () => <div>Test</div>;
export default TestComponent;

内容的提问来源于stack exchange,提问作者Slbox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:33:13