webpack的css-loader、react-css-modules中生成的hash不一样

发布于 2022-09-12 23:46:53 字数 1481 浏览 17 评论 0

webpack中像实现css Module的功能。
安装babel-plugin-react-css-modules后根据官方进行配置:插件的github

const config = WebpackMerge.merge(WebpackBase, {
  module: {
    rules: [
      {
        test: [/\.s[ac]ss$/i, /\.css$/i],
        use: [
          // "style-loader",
          MiniCssExtractPlugin.loader,
          {
            loader: "css-loader",
            options: {
              importLoaders: 1,
              modules: {
                localIdentName: "[path][name]__[local]--[sha256:hash:base64:5]",
              },
            },
          },
          "sass-loader",
        ],
      },
      {
        test: /\.(jsx|js)$/,
        loader: "babel-loader",
        options: {
          cacheDirectory: true,
          plugins: [
            [
              "react-css-modules",
              {
                context: path.join(__dirname, "../"),
                exclude: "node_modules",
                generateScopedName:
                  "[path][name]__[local]--[sha256:hash:base64:5]",
              },
            ],
          ],
        },
        exclude: [path.join(__dirname, "../node_modules")],
      },
    ],
  },
});

image.png

由于生成的hash不一致。className无法对应到相应的样式。

这里应该如何配置才能使得 hash值相等

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

慈悲佛祖 2022-09-19 23:46:53

原因:
去搜索了下,应该是最新版的css-loader6.2.0使用了新的hash算法,所以导致两者的生成的hash不一致

解决:
在webpack.config.js中使用"generic-names": "^3.0.0", 生成类名,在babel.config.js中使用生成类名,也就是通过generic-names让两者达成一致。

webpack.config.js 配置如下:

const genericNames = require('generic-names');
const generateScope = genericNames(localIdentName, {

context: process.cwd(),

});
const getStyleLoaders = (cssOptions, preProcessor = []) => {

const loaders = [

// require.resolve('style-loader'),

MiniCssExtractPlugin.loader,

// isProd ? MiniCssExtractPlugin.loader : require.resolve('style-loader'),

{

loader: require.resolve('css-loader'),

options: cssOptions,

},

];

if (preProcessor.length > 0) {

for (let item of preProcessor) {

loaders.push(require.resolve(item));

}

}

return loaders;

};
{

test: /\.scss$/,

exclude: /node_modules/,

include: path.resolve(__dirname, 'src'),

use: getStyleLoaders(

{

importLoaders: 1,

// modules: {

// localIdentName: '[name]__[local]_[hash:base64:5]',

// localIdentContext: path.resolve(__dirname, 'src'),

// },

modules: {

getLocalIdent({ resourcePath }, localIdentName, localName) {

return generateScope(localName, resourcePath);

},

},

},

['sass-loader']

),

},

babel.config.js 配置如下:

const genericNames = require('generic-names'); // v3.0.0
// babel-plugin-react-css-modules

[

'react-css-modules',

{

generateScopedName: '[name]__[local]_[hash:base64:5]',

filetypes: {

'.scss': {

syntax: 'postcss-scss',

},

},

exclude: 'node_modules',

},

],
甜是你 2022-09-19 23:46:53

新版的 css-loader 生成算法变了,简单的解决办法是回退到 css-loader@3.6.0 版本

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文