5

问题

我试图在我的 React 项目中使用babel-plugin-react-css-modules以获得更好的性能,而不是React CSS Modules

但是,样式未正确应用。

原因

标签中的版本<style>用奇怪的连字符包裹,例如:

  • <style>标签中:-components-Foo-___Foo__foo___1fcIZ-
  • 关于 DOM 元素类名:components-Foo-___Foo__foo___1fcIZ

即使我们使用相同localIdentName的,生成的结果也与 css 中的选择器和 DOM 元素上的 className 不同。

(注意:在 babel-plugin-react-css-modules 中,localIdentName[path]___[name]__[local]___[hash:base64:5]硬编码的 options.generateScopedName

知道为什么会有 hypen-wrapper 吗?

4

1 回答 1

4

经过一番挣扎,自己找到了解决方案。

原因

这是由于css-loader: 如果选项周围有双引号localIdentName,它将用连字符包裹生成的类名。

工作示例

所以不要在 webpack 配置中这样做:

{
    test: /\.(scss|sass)$/,
    use: [
        'style-loader?sourceMap',
        'css-loader?modules="true"&importLoaders="1"&localIdentName="[path]___[name]__[local]___[hash:base64:5]"',
        'sass-loader?sourceMap',
    ],
},

做这个:

{
    test: /\.(scss|sass)$/,
    use: [
        'style-loader?sourceMap',
        'css-loader?modules="true"&importLoaders="1"&localIdentName=[path]___[name]__[local]___[hash:base64:5]',
        'sass-loader?sourceMap',
    ],
},

如果您使用的是 Webpack 2+,或者事件会更好

{
        test: /\.(scss|sass$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 1,    
              modules: true,
              sourceMap: true,
              localIdentName: '[path]___[name]__[local]___[hash:base64:5]'
            }
          },
          'sass-loader'
        ]
}
于 2017-12-06T15:49:20.653 回答