无法从CSS模块转换中跳过第三方库CSS

时间:2018-06-14 14:16:04

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

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

  1. CSS-装载机
  2. react-css-modules
  3. babel-plugin-react-css-modules
  4. 我使用babel-plugin-react-css-modules来平衡代码简单性和性能,除了一件事以外,一切似乎都运行正常:我的第三方库(Bootstrap和Font Awesome)也包含在CSS模块转换中。< / p>

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

    以上内容将className转换为NavLink。但是,span内部需要引用全局样式才能呈现图标。

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

    上面的范围没有被赋予预期的转换后的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';
    

3 个答案:

答案 0 :(得分:2)

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

简而言之,到目前为止,似乎没有任何选项可以忽略/排除某些路径被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);
    }
  }
}

答案 1 :(得分:1)

对我来说,使用:global可以:

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

Ps:有关使用webpack配置的操作,请参见另一个答案。

source

答案 2 :(得分:1)

来自playing771

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