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

使用Rollup发布React组件库时Tailwind样式不生效问题

问题描述

使用Tailwind CSS v4 + Rollup构建React组件库,发布后在其他项目中使用时,组件内置的变体样式(比如primary/secondary对应的Tailwind类)完全不生效,但通过className传入的自定义Tailwind类可以正常工作。

文件夹结构:
文件夹结构

相关代码如下:

Button.tsx

import type { ButtonHTMLAttributes } from "react"
import { twMerge } from "tailwind-merge"

export interface IButton extends ButtonHTMLAttributes<HTMLButtonElement> {
    variant?: "base" | "primary" | "secondary"
}

const styles = {
    base: "border border-gray-300 bg-transparent hover:border-gray-400",
    primary: "bg-amber-500 border border-amber-500 text-white hover:border-amber-600 hover:bg-amber-600 disabled:bg-amber-500/50 disabled:border-amber-500/1",
    secondary: "bg-gray-200 border border-gray-200 text-gray-800 hover:bg-gray-300 hover:border-gray-300 disabled:bg-gray-100 disabled:border-gray-100"
}

export const Button = ({ type = "submit", disabled = false, className, variant = "base", children }: IButton) => {
    return (
        <button type={type} disabled={disabled} className={twMerge(`rounded-md px-4 py-2 cursor-pointer disabled:cursor-not-allowed transition-colors duration-150 uppercase ${styles[variant]} ${className}`)}>
            {children}
        </button>
    )
}

src/index.ts

import "./styles.css";
export * from "./components";

styles.css

@import "tailwindcss";

package.json

{
  "name": "react-ui-lib-npm",
  "version": "1.0.0",
  "main": "dist/index.cjs.js",
  "module": "dist/index.esm.js",
  "types": "dist/index.d.ts",
  "files": [
    "dist"
  ],
  "scripts": {
    "build": "rollup -c",
    "dev": "rollup -c -w"
  },
  "peerDependencies": {
    "react": ">=16.8.0",
    "react-dom": ">=16.8.0"
  },
  "devDependencies": {
    "@rollup/plugin-commonjs": "^25.0.0",
    "@rollup/plugin-node-resolve": "^15.0.0",
    "@rollup/plugin-typescript": "^11.0.0",
    "@tailwindcss/postcss": "^4.0.0",
    "@types/react": "^18.0.0",
    "rollup": "^2.79.2",
    "rollup-plugin-peer-deps-external": "^2.2.4",
    "rollup-plugin-postcss": "^4.0.2",
    "rollup-plugin-terser": "^7.0.2",
    "tailwindcss": "^4.0.0",
    "typescript": "^5.0.0"
  },
  "dependencies": {
    "clsx": "^2.0.0",
    "tailwind-merge": "^3.3.1",
    "tslib": "^2.8.1"
  }
}

rollup.config.js

import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import typescript from "@rollup/plugin-typescript";
import peerDepsExternal from "rollup-plugin-peer-deps-external";
import postcss from "rollup-plugin-postcss";
import { terser } from "rollup-plugin-terser";

export default {
  input: "src/index.ts",
  output: [
    {
      file: "dist/index.cjs.js",
      format: "cjs",
      sourcemap: true,
    },
    {
      file: "dist/index.esm.js",
      format: "esm",
      sourcemap: true,
    },
  ],
  plugins: [
    peerDepsExternal(),
    resolve(),
    commonjs(),
    postcss({
      config: {
        path: "./postcss.config.js",
      },
      extract: true,
      minimize: true,
      sourceMap: true,
      extensions: [".css"],
    }),
    typescript({
      tsconfig: "./tsconfig.json",
    }),
    terser(),
  ],
  external: ["react", "react-dom"],
};

postcss.config.mjs

module.exports = {
  plugins: {
    "@tailwindcss/postcss": {},
  },
};

解决方案

1. 为Tailwind v4添加content配置,扫描组件源码中的类名

Tailwind v4默认仅扫描CSS文件,不会自动识别TS/TSX文件字符串中的类名。需要创建tailwind.config.js,指定扫描路径:

/** @type {import('tailwindcss').Config} */
export default {
  content: [
    "./src/**/*.{ts,tsx}", // 扫描所有TS/TSX组件文件
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

2. 调整PostCSS配置,加载自定义Tailwind配置

修改postcss.config.mjs,让Tailwind使用刚才创建的配置文件:

import tailwindcss from 'tailwindcss';
import tailwindConfig from './tailwind.config.js';

export default {
  plugins: {
    tailwindcss: tailwindConfig,
  },
};

3. 验证构建产物

运行npm run build后,检查dist目录下生成的CSS文件(如dist/index.css),确认其中包含按钮变体对应的类(比如.bg-amber-500、.hover\:bg-amber-600等)。

4. 在package.json中声明CSS入口

确保使用方能正确引入组件库样式,在package.json中添加style字段:

{
  // ... 其他配置
  "style": "dist/index.css"
}

5. 使用方项目注意事项

若使用方也用Tailwind v4,无需额外配置(组件库已打包独立CSS);若使用方用旧版Tailwind,需确保他们的配置不会冲突覆盖组件样式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:36:02