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

使用Vite+Rollup manualChunks时出现React未初始化引用错误

问题原因

你手动拆分React/ReactDOM和@emotion的独立chunk后,浏览器加载chunk的顺序不受控,@emotion的chunk先于React chunk执行,而@emotion依赖React,导致执行时React还未初始化,触发Cannot access 'React' before initialization错误。

解决方案

方案1:合并依赖chunk(最简单)

把React、ReactDOM和@emotion打包到同一个vendor chunk,彻底避免依赖顺序问题:

// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules/react/') || id.includes('/node_modules/react-dom') || id.includes('@emotion')) {
            return 'react-vendor';
          }
          // 其他自定义chunk规则...
        }
      }
    }
  }
}

方案2:明确chunk依赖关系

如果要保持分开打包,需让Rollup明确@emotion chunk依赖React chunk,确保React chunk优先加载。修改manualChunks函数,利用moduleInfo参数识别依赖关联:

// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks(id, moduleInfo) {
          if (id.includes('node_modules/react/') || id.includes('/node_modules/react-dom')) {
            return 'react';
          }
          // 标记依赖React的@emotion模块为独立chunk
          if (id.includes('@emotion') && moduleInfo.getImports().some(imp => imp.includes('react'))) {
            return 'emotion';
          }
          // 其他自定义chunk规则...
        }
      }
    }
  }
}

Vite会自动根据chunk的依赖关系,在生成的HTML中确保React chunk先于emotion chunk加载执行。

额外检查项

  • 确认项目中存在import React from 'react'的显式导入(React 17+虽支持自动导入,但@emotion部分场景仍需全局React变量);
  • 核对@emotion版本与React版本的兼容性,避免版本不匹配引发隐性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:02:48