css模块化导致antd引入无效的问题
我用的是webpack5,在react18中配置css module后导致antd全局样式失效,这时候可以考虑css单独配置不用模块化,less也单独有一套自己的配置,启用模块化,less用于业务代码,css用于第三方代码,配置如下:
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); //把css从JS中单独提取做压缩 const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //把文件复制到打包后的指定位置 const CopyPlugin = require("copy-webpack-plugin"); const isDev = process.env.NODE_ENV == "dev"; // CSS是加載 第三方的CSS,比如antd,less是業務的css,這樣就可以避免CSS模塊化對antd引入后讓antd無效的問題 module.exports = { entry: { main: path.resolve(__dirname, "../src/main.tsx"), //key就是文件输出的命名 }, output: { filename: "[name].[chunkhash:8].bundle.js", //key+哈希组成的名字 chunkFilename: "[name].[chunkhash:8].js", //key+哈希组成的名字,针对的是懒加载文件,例如react.lazy导入的文件 path: path.resolve(__dirname, "../dist"), clean: true, assetModuleFilename: "../src/assets/imgs/[name][ext]", //绝对路径会报错,就是不要path.resolve(__dirname, ".."),这么写 }, resolve: { alias: { "~": path.resolve(__dirname, "../src"), "@components": path.resolve(__dirname, "../src/components"), }, extensions: [".js", ".jsx", ".json", ".tsx", ".ts"], //表示这几个的后缀名可省略,webpack打包的时候看到这种省略后缀名的文件会先从这个集合中匹配 }, module: { rules: [ { test: /\.m?js$/, exclude: /(node_modules|bower_components)/, use: [ { loader: "thread-loader", }, { loader: "babel-loader", options: { presets: [isDev && "@babel/preset-env"].filter(Boolean), }, }, ], }, { test: /\.(tsx|ts)?$/, use: ["ts-loader"], //thread-loader不能和ts-loader一起用,会不兼容而报错 exclude: /node_modules/, }, { test: /\.css$/i, exclude: /node_modules/, use: [ // MiniCssExtractPlugin和style-loader只能存在一个,两个都有会出document is not defined的错误,style-loader是提取样式插入到styleMiniCssExtractPlugin是提取样式到新的一个文件用link的方式引入,不支持热更新,需要手动刷新 isDev ? { loader: "style-loader", } : { loader: MiniCssExtractPlugin.loader, options: { esModule: false, //默认是es6的模块方式,浏览器上没响应,要声明为false }, }, { loader: "css-loader", options: { sourceMap: false, importLoaders: 1, }, }, "postcss-loader", ], }, { test: /\.css$/, // 排除业务模块,其他模块都不采用css modules方式解析 exclude: [/src/], use: ["style-loader", "css-loader"], }, { test: /\.less$/i, exclude: /node_modules/, use: [ // MiniCssExtractPlugin和style-loader只能存在一个,两个都有会出document is not defined的错误,style-loader是提取样式插入到styleMiniCssExtractPlugin是提取样式到新的一个文件用link的方式引入,不支持热更新,需要手动刷新 isDev ? { loader: "style-loader", } : { loader: MiniCssExtractPlugin.loader, options: { esModule: false, //默认是es6的模块方式,浏览器上没响应,要声明为false }, }, { loader: "css-loader", options: { sourceMap: false, // modules: true, modules: { localIdentName: "css__module__[name]__[local][chunkhash:8]", //加个css__module__前缀,防止purgecss-webpack-plugin打包的时候给排除了 }, importLoaders: 1, }, }, { loader: "postcss-loader", }, { loader: "less-loader", options: { lessOptions: { strictMath: true, }, }, }, ], }, { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: "asset/resource", }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/, // 匹配媒体文件 type: "asset", // type选择asset parser: { dataUrlCondition: { maxSize: 10 * 1024, // 小于10kb转base64位 }, }, }, ], }, plugins: [ //本插件会将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载。 !isDev && new MiniCssExtractPlugin({ filename: "[name].css", //key+哈希组成的名字 }), new HtmlWebpackPlugin({ title: "llc-stage", template: path.resolve(__dirname, "../public/index.html"), // favicon: 'public/favicon.ico' }), //拷贝指定文件夹原样打包到指定目录 new CopyPlugin({ patterns: [ { from: path.resolve(__dirname, "../src/assets/imgs"), to: path.resolve(__dirname, "../dist/src/assets/imgs"), }, ], }), ].filter(Boolean), // 开启webpack持久化存储缓存 cache: { type: "filesystem", // 使用文件缓存 }, };
问题解决
积累小的知识,才能成就大的智慧,希望网上少一些复制多一些原创有用的答案