【问题标题】:MiniCssExtractPlugin is garbling and obfuscating my class namesMiniCssExtractPlugin 乱码和混淆我的类名
【发布时间】:2023-03-22 02:40:02
【问题描述】:

我在我的 typescript 和 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"] 
   }
}

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

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

.container {
   font-size: 1.3rem;
}

.is-completed {
   text-decoration: line-through;
   color: #00ff00;
}

当我的应用程序使用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; }

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

【问题讨论】:

    标签: css webpack mini-css-extract-plugin


    【解决方案1】:

    当您在 CSS 配置中设置 modules: true 时,您是在告诉 css-loader 使用 CSS-Modules 将您的类名限定为特定文件。

    【讨论】:

      【解决方案2】:

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

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

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

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

      您可以使用设置为 localIdentName 的内容以及显示的哈希字符数。

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

      【讨论】:

      • 我使用您提供的上述 webpack.config.js 将 css 转换为不同的哈希名称。但我使用的是原始 html 没有 js 类名是因为它没有改变任何东西所以我怎样才能根据新的哈希生成的 css 类来处理我的 html 类
      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2020-10-05
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多