css - React SSR 应用程序中服务器和客户端的 Webpack localIdentName 不匹配

标签 css webpack css-modules

我正在尝试将 Css 模块与 React SSR 一起使用,并且我添加了以下 webpack 配置。

module: {
        rules: [
            {
                test: /\.jsx?$/,
                exclude: /(node_modules|bower_components)/,
                loader: "babel-loader",
            },{
                test:/\.(s*)css$/,
                use: [
                    {
                        loader: MiniCssExtractPlugin.loader,
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            modules: {
                                mode: 'local',
                                localIdentName: "[name]__[local]___[hash:base64:5]"
                            },
                            import: true,
                            importLoaders: true,
                        }
                    },
                    {
                        loader: "sass-loader",
                    }
                ],
            },
        ]
    },

这会在 dist 包中生成以下 css 文件

.Home\.module__Container___3B08 {
  display: flex;
  width: 600px;
  height: 300px;
  border: 2px solid red; }

在我的 DOM 中,div 具有以下样式

<div class="Home-module__Container___14QBF">

我该如何纠正?以及为什么 webpack 配置与浏览器中的配置不同

最佳答案

您必须在插件下的 .babelrc 文件中添加 CSS 模块配置。然后只有生成的 CSS 才会与您的 html 中的 CSS 相匹配。

.babelrc

"plugins": [
   ["react-css-modules", {
     "generateScopedName": "[name]__[local]___[hash:base64:5]"
    }]
 ],

更新:

必须使用 css-modules-require-hook 进行服务器端 CSS 渲染,并使用 generic-names 在客户端和服务器中生成哈希。

索引.js

const hook = require( "css-modules-require-hook" );
const genericNames = require( "generic-names" );

const generate = genericNames( "[name]__[local]___[hash:base64:5]", {
   context: process.cwd(),
});

// Scope Generator function.
hook( {
    generateScopedName: ( c, path ) => {
        return generate( c, path );
    },
} ); 

webpack.config.js

const genericNames = require( "generic-names" );
const generate = genericNames( "[name]__[local]___[hash:base64:5]", {
  context: process.cwd(),
});

const getLocalIdent = ( loaderContext, localIdentName, localName ) =>
    generate( localName, loaderContext.resourcePath );

.....
{
    loader: "css-loader",
    options: {
        modules: {
           getLocalIdent,
        },
     },
 },

有关更多信息,请查看此存储库:https://github.com/ajayvarghese/react-ssr/tree/css-modules . 注意:Repo 使用更新版本的 babel 包。

关于css - React SSR 应用程序中服务器和客户端的 Webpack localIdentName 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57035776/

相关文章:

javascript - 如何使用 Webpack 5 和 Babel 7 创建 IE11 Bundle

javascript - 使用服务器端渲染设置 webpack 以在 asp.net 核心项目中加载 Sass 文件

javascript - 如何在 create-react-app 中使用 Sass 和 CSS 模块?

javascript - 更改 jQuery 倒计时

javascript - 如何修复 "BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default"错误?

reactjs - 如何让源映射适用于 React Css 模块?

css - 散列后如何定位 CSS 模块类?

javascript - Gulp 任务复制目录中的所有文件,编译所有 SCSS 文件,让其他文件保持不变?

css - 如何在 CSS 中重叠边框以创建选项卡?

javascript - Form 如何从 span 中获取 div 元素