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

使用Theme-UI的项目集成Storybook 6时遇JSX编译错误求助

解决Theme-UI集成Storybook 6时的"pragma and pragmaFrag cannot be set when runtime is automatic"错误

问题原因

Storybook 6默认启用React 17+的自动JSX runtime(automatic),但Theme-UI依赖经典runtime(classic)下的自定义JSX pragma,两者冲突导致报错。你之前追加@babel/preset-react配置的方式因优先级问题未生效——Storybook自带的React preset会先加载,追加的配置无法覆盖原有设置。

解决步骤

1. 修改Storybook已有React preset的runtime配置

在.storybook/main.js中,不要追加新的preset,而是直接找到已存在的@babel/preset-react并修改其配置:

module.exports = {
  // 其他Storybook配置...
  babel: async (options) => {
    // 遍历presets,定位并修改React preset
    const updatedPresets = options.presets.map(preset => {
      if (Array.isArray(preset) && preset[0] === '@babel/preset-react') {
        return [
          '@babel/preset-react',
          {
            ...preset[1],
            runtime: 'classic',
            pragma: 'jsx',
            pragmaFrag: 'React.Fragment' // 保证Fragment语法正常工作
          }
        ];
      }
      return preset;
    });

    return {
      ...options,
      presets: updatedPresets
    };
  }
};

2. 避免项目根目录Babel配置干扰

如果项目根目录存在babel.config.js或.babelrc,检查是否全局设置了runtime: 'automatic'。可以针对Storybook环境单独切换runtime:

// 项目根目录babel.config.js
module.exports = api => {
  const isStorybook = api.env('storybook');
  return {
    presets: [
      [
        '@babel/preset-react',
        {
          runtime: isStorybook ? 'classic' : 'automatic'
        }
      ]
    ]
  };
};

3. 验证配置并清除缓存

重启Storybook服务,确认组件文件中的/** @jsx jsx */ pragma正常工作。若仍有问题,清除Storybook缓存后重试:

npx storybook build --no-cache
# 或手动删除node_modules/.cache/storybook目录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:02:15