如何在 Webpack 配置文件中将 CSS 名称设置为不是哈希?

Posted

技术标签:

【中文标题】如何在 Webpack 配置文件中将 CSS 名称设置为不是哈希?【英文标题】:How can I set a CSS name not to be a hash in a Webpack configuration file? 【发布时间】:2018-04-13 14:33:36 【问题描述】:

我只是想知道为什么在我构建并运行我的 React + Webpack 应用程序之后,我的 CSS 名称变成了 hash。是否有我可能错过的将 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 上 importuse 的 CSS 的源代码:

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')
);

【问题讨论】:

【参考方案1】:

可以使用 CSS 模块的 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-loader 模块选项设置为对象,您实际上是将模块设置为true,但具有特定选项。

localIdentName 设置为[local] 完全违背了使用CSS 模块的目的。

【讨论】:

【参考方案2】:

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

详细信息可以关注the documentation for CSS Loader

 module: 
    rules: [

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

【讨论】:

【参考方案3】:

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

您可以做以下三件事:

1:在应用程序级别,您可以将以下配置添加到您的 Webpack 以禁用 CSS 模块。不建议这样做,因为它可能会导致碰撞和难以发现的错误。

options: 
    modules: false

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

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

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

:global(.container) 
  padding: 10px;

【讨论】:

我在尝试 2 号时遇到错误。这是消息:You may need an appropriate loader to handle this file type. 我也试过 1 号和 3 号。 css 不工作。

以上是关于如何在 Webpack 配置文件中将 CSS 名称设置为不是哈希?的主要内容,如果未能解决你的问题,请参考以下文章

如何在与 webpack 捆绑时将 SASS 变量转换为原生 CSS 变量?

webpack打包Js文件

webpack之插件optimize css assets webpack plugin

Webpack - 如何确定 CSS 文件的输出样式?

webpack

webpack配置css兼容性和压缩