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

使用Rollup打包Chakra UI组件库后样式丢失问题求助

Chakra UI组件库Rollup打包后样式丢失问题

我使用TypeScript、React和Chakra UI构建组件库,通过Rollup完成打包并使用npm link测试时,发现除主题配置外,所有CSS样式均丢失。组件样式均通过Chakra UI的主题及组件props设置,无独立CSS文件。以下是我的配置文件,寻求解决方法:

Rollup配置

import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import typescript from "@rollup/plugin-typescript";
import terser from "@rollup/plugin-terser";
import external from "rollup-plugin-peer-deps-external";
import dts from "rollup-plugin-dts";
import svgr from "@svgr/rollup";
import packageJson from "./package.json" assert { type: "json" };

export default [
  {
    input: "src/index.ts",
    output: [
      {
        file: packageJson.main,
        format: "cjs",
        sourcemap: true,
        name: "react-lib",
      },
      {
        file: packageJson.module,
        format: "esm",
        sourcemap: true,
      },
    ],
    external: Object.keys(packageJson.peerDependencies),
    plugins: [
      external(),
      resolve(),
      commonjs(),
      typescript({ tsconfig: "./tsconfig.json" }),
      terser(),
      svgr(),
    ],
  },
  {
    input: "dist/esm/types/index.d.ts",
    output: [{ file: "dist/index.d.ts", format: "esm" }],
    external: [/\.css$/],
    plugins: [dts()],
  },
];

package.json

{
  "name": "name-of-file",
  "version": "0.0.1",
  "description": "Vivly's Internal Component Library",
  "main": "dist/cjs/index.js",
  "module": "dist/esm/index.js",
  "types": "dist/index.d.ts",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "rollup -c",
    "storybook": "storybook dev -p 6006",
    "build-storybook": "storybook build"
  },
  "author": "uhuh",
  "license": "ISC",
  "peerDependencies": {
    "react": "^18.2.0",
    "@chakra-ui/react": "^2.5.1"
  },
  "devDependencies": {
    "@babel/core": "^7.21.0",
    "@chakra-ui/icons": "^2.0.17",
    "@chakra-ui/react": "^2.5.1",
    "@chakra-ui/storybook-addon": "^4.0.16",
    "@emotion/react": "^11.10.6",
    "@emotion/styled": "^11.10.6",
    "@rollup/plugin-commonjs": "^24.0.1",
    "@rollup/plugin-node-resolve": "^15.0.1",
    "@rollup/plugin-terser": "^0.4.0",
    "@rollup/plugin-typescript": "^11.0.0",
    "@storybook/addon-actions": "^7.0.0-beta.59",
    "@storybook/addon-essentials": "^7.0.0-beta.59",
    "@storybook/addon-interactions": "^7.0.0-beta.59",
    "@storybook/addon-links": "^7.0.0-beta.59",
    "@storybook/addon-mdx-gfm": "^7.0.0-beta.59",
    "@storybook/react": "^7.0.0-beta.59",
    "@storybook/react-webpack5": "^7.0.0-beta.59",
    "@storybook/testing-library": "^0.0.14-next.1",
    "@svgr/rollup": "^6.5.1",
    "@types/react": "^18.0.28",
    "@types/rollup-plugin-peer-deps-external": "^2.2.1",
    "babel-loader": "^8.3.0",
    "framer-motion": "^10.0.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "recharts": "^2.4.3",
    "rollup": "^3.17.3",
    "rollup-plugin-dts": "^5.2.0",
    "rollup-plugin-peer-deps-external": "^2.2.4",
    "storybook": "^7.0.0-beta.59",
    "typescript": "^4.9.5"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "jsx": "react",
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

解决方法

1. 补充Peer Dependencies

Chakra UI依赖@emotion/react和@emotion/styled实现css-in-js,需要将这两个包加入peerDependencies,确保用户项目提供统一版本,避免样式注入冲突:

"peerDependencies": {
  "react": "^18.2.0",
  "@chakra-ui/react": "^2.5.1",
  "@emotion/react": "^11.0.0",
  "@emotion/styled": "^11.0.0",
  "framer-motion": "^10.0.0"
}

2. 修改TypeScript的JSX配置

Chakra UI需要React 17+的自动JSX导入支持,将tsconfig.json中的jsx字段改为react-jsx:

"jsx": "react-jsx"

3. 配置Rollup处理Emotion语法

添加@rollup/plugin-babel并配置Emotion插件,确保Chakra组件的样式代码被正确编译:

  • 安装依赖:
npm install @rollup/plugin-babel @emotion/babel-plugin --save-dev
  • 修改Rollup配置,在plugins数组中加入babel配置:
import babel from "@rollup/plugin-babel";

// ... 其他插件
plugins: [
  external(),
  resolve(),
  commonjs(),
  babel({
    exclude: "node_modules/**",
    presets: ["@babel/preset-react"],
    plugins: ["@emotion/babel-plugin"],
    babelHelpers: "bundled"
  }),
  typescript({ tsconfig: "./tsconfig.json" }),
  terser(),
  svgr(),
],

4. 测试项目配置检查

确保测试项目中:

  • 正确包裹ChakraProvider,并引入组件库的主题配置
  • 已安装所有peer依赖包(包括@emotion/react、@emotion/styled)

5. 重新打包并测试

执行npm run build重新打包组件库,然后在测试项目中重新执行npm link并重启项目,验证样式是否恢复。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:12:31