如何在 Webpack 配置文件中将 CSS 名称设置为不为散列?

IT技术 reactjs hash webpack webpack-style-loader css-loader
2021-04-29 16:08:35

我只是想知道为什么我的 CSS 名称在我构建并运行我的 React + Webpack应用程序变成了哈希是否有我可能错过的高级配置以正常设置 CSS 名称?

这是我的 Webpack 配置:

var webpack = require('webpack');
var path = require('path');

module.exports = {
    entry: './app/app.jsx',
    output: {
        path: __dirname,
        filename: './public/bundle.js'
    },
    resolve: {
        alias: {
            applicationStyles: path.resolve(__dirname,'app/styles/app.css'),
            Clock: path.resolve(__dirname,'app/components/Clock.jsx'),
            Countdown: path.resolve(__dirname,'app/components/Countdown.jsx'),
            CountdownForm: path.resolve(__dirname,'app/components/CountdownForm.jsx')
        },
        extensions: ['.js', '.jsx']
    },
    module: {
        rules: [
            {
                test: /\.jsx?$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.css$/,
                use: [
                    { loader: 'style-loader' },
                    {
                        loader: 'css-loader',
                        options: {
                            modules: true
                        }
                    }
                ]
            }
        ]
    },
    devtool: 'cheap-module-eval-source-map'
};

这是变成哈希的 CSS 名称:

在此处输入图片说明


为了更清楚,我在 React 上添加了我importuseCSS的源代码

import React from 'react';
import ReactDOM from 'react-dom';
import Countdown from 'Countdown';
/* Import the CSS file */
import Styles from 'applicationStyles';

ReactDOM.render(
    /* Use CSS */
    <div className={Styles.box}>
        <Countdown/>
    </div>,
    document.getElementById('app')
);
3个回答

这就是 Webpack 默认所做的,以避免相同的 CSS 类(来自不同的 CSS module)发生冲突。

您可以执行以下三件事:

1:在应用层面,您可以将以下配置添加到您的 Webpack 中以禁用 CSS module。不推荐这样做,因为它可能导致冲突和难以发现的错误。

options: {
    modules: false
}

2:在文件层面,可以这样导入,防止Webpack混淆类名。这在导入第三方配置库 CSS 文件时很有用。

import '!style!css!golden-layout-css-base';

3:在CSS类级别,可以使用:global(.your-class-name)避免混淆特定类

:global(.container) {
  padding: 10px;
}

在您的 Webpack 配置中,CSS 加载器需要为前缀名称进行配置。基本上只localIdentName:'[local]'前缀设置为本地类名。

有关详细信息,您可以查看CSS Loader 的文档

 module: {
    rules: [

        {
            test: /\.css$/,
            use: [
                { loader: 'style-loader' },
                {
                    loader: 'css-loader',
                    options: {
                        modules: true,
                        localIdentName:'[local]'
                    }
                }
            ]
        }
    ]
}

通过将类名localIdentName设置为[local]_[hase:base64:5].

[local] 这里指的是类名。

[hash:base64:5] 表示生成长度为 5 的 Base64 哈希字符串。

{
  test: /\.css$/,
  use: [
     'style-loader',
     {
       loader: 'css-loader',
       options: {
         modules: {
           localIdentName: '[local]_[hash:base64:5]'
         }
      }
   ]
}

通过将css-loadermodule选项设置为对象,您实际上是将module设置为true,但具有特定选项。

将 设置localIdentName[local]完全违背了使用 CSS module的目的。