【问题标题】:How can I set a CSS name not to be a hash in a Webpack configuration file?如何在 Webpack 配置文件中将 CSS 名称设置为不是哈希?
【发布时间】: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')
);

【问题讨论】:

    标签: reactjs hash webpack webpack-style-loader css-loader


    【解决方案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 不工作。
        猜你喜欢
        • 1970-01-01
        • 2020-07-17
        • 2020-03-09
        • 2023-03-17
        • 2021-02-05
        • 1970-01-01
        • 2013-09-19
        • 2020-03-12
        • 1970-01-01
        相关资源
        最近更新 更多