MiniCssExtractPlugin正在混淆和混淆我的类名

Kno*_*uch 2 css webpack mini-css-extract-plugin

我在我的打字稿和webpack项目中使用MiniCssExtractPlugin.

我的MiniCssExtractPlugin的webpack配置看起来像

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
   entry: './src/index.tsx',
   mode: "development",
   output: {
      path: path.resolve(__dirname, "build"),
      filename: 'bundle.js'
   },
   module: {
      rules: [
         {
            test: /\.tsx?$/,
            loader: "awesome-typescript-loader"
         },
         {
            enforce: "pre",
            test: /\.js$/,
            loader: "source-map-loader"
         },
         {
            test: /\.scss$/,
            use: [
               MiniCssExtractPlugin.loader,
               {
                 loader: "css-loader",
                 options: {
                   modules: true,
                   sourceMap: true,
                   importLoader: 2
                 }
               },
               "sass-loader"
            ]
         }
      ]
   },
   plugins: [
      new HtmlWebpackPlugin({
         template: "./index.html"
      }),
      new MiniCssExtractPlugin({
         filename: "foo.css",
         chunkFilename: "[id].css"
      })],
   devtool: "source-map",
   resolve: {
      extensions: [".js", ".ts", ".tsx"] 
   }
}
Run Code Online (Sandbox Code Playgroud)

现在我项目中的scss文件有这个片段

h1 {
   border-bottom: 3px solid #880055;
   display: inline;
}

.container {
   font-size: 1.3rem;
}

.is-completed {
   text-decoration: line-through;
   color: #00ff00;
}
Run Code Online (Sandbox Code Playgroud)

当我的应用程序运行时,npm start我可以看到标题H1有一个颜色的下划线880055.所以这意味着我的scss文件被正确读取.

如果我进入chrome开发人员工具并进入网络选项卡并寻找CSS.我可以看到正在下载的foo.css.如果我查看foo.css的内容

它没有我的"已完成"课程.相反,我看到类似的东西

h1 {
  border-bottom: 3px solid #880055;
  display: inline; }

.pxcHIyOVHeytUeG27u4TO {
  font-size: 1.3rem; }

._1Z5_KVJNKd1X2P3HKM63j {
  text-decoration: line-through;
  color: #00ff00; }
Run Code Online (Sandbox Code Playgroud)

所以像h1这样的元素类很好,但其他一切都是乱码.这是怎么回事?

Sea*_*ira 6

当您modules: true在CSS配置中设置时,您告诉css-loader使用CSS模块将您的类名称范围限定为特定文件.


Ste*_*h M 6

您可以使用选项localIndentName中的查询参数css-loader来指定您希望生成的类(标识符)在开发和/或产品中的外观。请参阅下面的示例,了解如何为我解决这个问题。

 module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
        loader: 'css-loader',
        options: {
          modules: {
            localIdentName: '[name]-[local]--[hash:base64:5]',
          },
        },
      },
    ],
  },
};
Run Code Online (Sandbox Code Playgroud)

如果我要使用上面示例中的配置,并且调用我正在渲染的组件的名称,HelloWorld并且该组件中使用的类是.container,如果我要运行我的应用程序(dev 或 prod)并检查devtools 我的组件上的类HelloWorld如下所示:

<div class="HelloWorld-container--16ABh"> Hello World </div>

您可以尝试设置您的内容localIdentName以及显示的哈希字符数。

localIdentName请参阅此处查询参数的文档: https://github.com/webpack-contrib/css-loader#localidentname