【问题标题】:Using modular CSS with Bootstrap 4 and React在 Bootstrap 4 和 React 中使用模块化 CSS
【发布时间】:2026-01-20 09:40:01
【问题描述】:

我已经使用 ModularCSS 和 webpack 启用了 postCSS:

{
  test: /\.css$/,
  exclude: /node_modules/,
  loader: "style-loader!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader"
}

这意味着我现在可以像这样导入“CSS 模块”:

components/app.js

import '../style/bootstrap.css';

这将确保整个应用程序基于引导程序的“全局 css”,例如重置。

此外,在组件中,我可以清楚地定义它们对 Bootstrap 的依赖关系,例如:

components/control.js

import Bootstrap from '../style/bootstrap.css';

class Control extends Component {

  render() {
    return (
      <button className={Bootstrap.btn + ' ' + Bootstrap['btn-primary']}>choose me</button>
    );
  }
}

但是,className={Bootstrap.btn + ' ' + Bootstrap['btn-primary']} 语法难以阅读且不易使用。

这个问题以前解决过吗?有关如何使其更具可读性和可操作性的任何建议?

【问题讨论】:

    标签: javascript twitter-bootstrap reactjs postcss css-modules


    【解决方案1】:

    你看过 React CSS 模块吗?

    使用装饰器,看起来很好用。

    https://github.com/gajus/react-css-modules#decorator

    对于多个类名,您需要将此选项设置为 true

    https://github.com/gajus/react-css-modules#allowmultiple

    【讨论】:

    【解决方案2】:

    您可以尝试使用classNames

    import Bootstrap from '../style/bootstrap.css';
    
    let cx = classNames.bind(Bootstrap);
    
    
    class Control extends Component {
    
      render() {
        let className = cx({
          btn: true,
          'btn-primary': true
        });
        return (
          <button className={className}>choose me</button>
        );
      }
    }
    

    【讨论】:

    • 这是不可能的,因为 CSS 模块具有本地化的样式名称。 IE。只有在我编辑的答案中才有可能,这似乎比以前更不可读。
    • 这可能会发生,因为您在 webpack 配置中排除了“node_modules”并且存在 Bootstrap css(不是吗?不确定 xD)
    • 什么意思? Bootstrap css 不存在,它是从../styles/bootstrap.css 加载的。它正在加载。问题是 CSS 模块(PostCSS 插件)本地化了实际的类名,所以它不是 btn 之类的东西,而是btn + some random string 之类的东西。
    • 看来这确实有效,但我必须使用import classNames from 'classnames/bind'; 而不是import classNames from 'classnames';。请注意,我也不能使用btnPrimary: true,但必须使用'btn-primary': true。然而,最终的结果似乎并不好。也许我原始方法中的字符串连接更具可读性。它肯定会减少代码。