【问题标题】:Unable to skip 3rd party library CSS from CSS-Module transformation无法从 CSS 模块转换中跳过 3rd 方库 CSS
【发布时间】:2018-11-24 08:35:16
【问题描述】:

我第一次尝试使用 React 和 Webpack 的 CSS 模块,我遇到了至少三种方法来实现它:

  1. css 加载器
  2. react-css-modules
  3. babel-plugin-react-css-modules

我选择了babel-plugin-react-css-modules,以平衡代码的简单性和性能,并且一切似乎都运行良好,除了一件事:我的第 3 方库(Bootstrap 和 Font Awesome)也包含在 CSS 模块转换中。

<NavLink to="/about" styleName="navigation-button"></NavLink>

上面将正确转换的className 分配给NavLink。但是,内部的span 需要引用全局样式才能呈现图标。

<span className="fa fa-info" />

上面的 span 没有分配预期的转换后的 className,但是我的捆绑样式表没有这些 CSS 类,因为它们正在被转换成其他东西,以模拟本地范围。

下面是我的.babelrc文件中激活babel-plugin-react-css-modules的内容:

{
  "presets": ["env", "react"],
  "plugins": [
    ["react-css-modules", {
      "generateScopedName": "[name]__[local]___[hash:base64:5]",
      "filetypes": {
        ".less": {
          "syntax": "postcss-less"
        }
      }
    }]
  ]
}

在我的 Webpack 配置中,下面是为转换配置 css-loader 的部分:

{
    test: /\.(less|css)$/,
    exclude: /node_modules/,
    use: extractCSS.extract({
        fallback: 'style-loader',
        use: [
            {
                loader: 'css-loader',
                options: {
                    minimize: true,
                    modules: true,
                    sourceMap: true,
                    localIdentName: '[name]__[local]___[hash:base64:5]'
                }
            },
            {
                loader: 'less-loader'
            }
        ]
    })
}

据我所知,上述规则应该排除库样式表,我还尝试专门为排除的样式表添加另一条规则,但这似乎不起作用,因为我猜这些样式表仍然使用原始规则。

为了从这两个库中导入 CSS,我的父样式表中有以下两行声明了一些全局样式:

@import '../../../node_modules/bootstrap/dist/css/bootstrap.min.css';
@import '../../../node_modules/font-awesome/css/font-awesome.min.css';

【问题讨论】:

    标签: reactjs webpack css-modules babel-plugin-react-css-modules


    【解决方案1】:

    我发现以下这两种方法可能会有所帮助:

    简而言之,到目前为止,似乎没有任何选项可以忽略/排除某些路径被 css-modules webpack 插件模块化。理想情况下,插件应该支持它,但是您可以尝试以下一些方法:

    使用两个 webpack 规则来利用 webpack 规则排除/包含:

    module.exports = {
      rules: [
        {
          test: /\.css$/,
          exclude: /node_modules/,
          use: [
            'style-loader',
            {
              loader: 'css-loader',
              options: {
                modules: true,
                localIdentName: '[path]__[local]___[hash:base64:5]',
              },
            },
          ],
        },
        {
          test: /\.css$/,
          include: /node_modules/,
          use: ['style-loader', 'css-loader']
        }
      ]
    }
    

    ...或者,从上面的第二个答案中注入 webpack 的 getLocalIdent 以手动排除某些路径。

    const getLocalIdent = require('css-loader/lib/getLocalIdent');
    
    {
      loader: 'css-loader',
      options: {
        modules: true,
        localIdentName: '[path][name]__[local]--[hash:base64:5]',
        getLocalIdent: (loaderContext, localIdentName, localName, options) => {
          return loaderContext.resourcePath.includes('semantic-ui-css') ?
            localName :
            getLocalIdent(loaderContext, localIdentName, localName, options);
        }
      }
    }
    

    【讨论】:

    • 哇,你的第二种方法正是我一直在寻找的……很长一段时间。 ——自己完全控制身份名称的能力。谢谢!
    • 我终于能够使用第一种方法让它工作。我正在使用较新版本的 webpack,因此我需要稍微更改模块/localIdenName 配置 modules: { localIdentName: '[path]__[local]___[hash:base64:5]' }
    【解决方案2】:

    对我来说使用:global 有效:

    .my-component {
        :global {
            .external-ui-component {
               padding: 16px;
               // Some other styling adjustments here
            }
            ...
        }
    }
    

    Ps:要使用 webpack 配置,请查看另一个答案。

    source

    【讨论】:

      【解决方案3】:

      从playing771更新解决方案

       {
          loader: 'css-loader',
          options: {
            modules: {
              auto: (resourcePath) => !resourcePath.includes('node_modules'),
              localIdentName: '[name]__[local]__[hash:base64:5]',
            },
          },
       },
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 2013-09-14
        • 2022-01-25
        • 2019-09-11
        • 2022-01-22
        • 2015-11-16
        • 2019-03-06
        相关资源
        最近更新 更多