Webpack5 配置 CssModules react-css-modules css-loader

 
以前天真地以爲react-css-modules使用與其他插件一樣,npm install安裝一下就好了。

直到我新起了一個項目才知道並沒有這麼簡單,react-css-modules使用是需要修改Webpack配置的。

如果不配置webpack,會報:Uncaught Error: "xxx" CSS module is undefined.等錯誤
關於react-css-modules怎麼用,可參照這篇:【React】防止CSS樣式感染:react-css-modules

Webpack配置
配置Webpack的目的是開啓css-loader模塊化(modules)。

Webpack配置如下


module.exports
= { module: { //模塊 rules: [ { //.css.less文件解析 test: /\.(css|less)$/, //匹配到css結尾的文件,加載css-loader, //去除.module.css;.module.less,因爲有單獨處理 exclude: [/\.module\.(css|less)/, /\.global\.less$/], use: [ { loader: 'style-loader', options: { //將當前loader添加到<head>標籤內容的最上面 insert: function (element) { var parent = document.querySelector('head') var lastInsertedElement = window._lastElementInsertedByStyleLoader if (!lastInsertedElement) { parent.insertBefore(element, parent.firstChild) } else if (lastInsertedElement.nextSibling) { parent.insertBefore(element, lastInsertedElement.nextSibling) } else { parent.appendChild(element) } } } }, { //css單獨分離文件加載 loader: MiniCssExtractPlugin.loader, options: { esModule: false } }, 'css-loader', 'postcss-loader', 'less-loader' ] }, { //.module.css;.module.less文件解析,添加css modules,防止樣式感染 test: /\.module\.(css|less)/, //匹配到less結尾的文件 use: [ { loader: 'style-loader', options: { //將當前loader添加到<head>標籤內容的最上面 insert: function (element) { var parent = document.querySelector('head') var lastInsertedElement = window._lastElementInsertedByStyleLoader if (!lastInsertedElement) { parent.insertBefore(element, parent.firstChild) } else if (lastInsertedElement.nextSibling) { parent.insertBefore(element, lastInsertedElement.nextSibling) } else { parent.appendChild(element) } } } }, { //css單獨分離文件加載 loader: MiniCssExtractPlugin.loader, options: { esModule: false } }, { loader: 'css-loader', options: { modules: { localIdentName: '[local]_[hash:base64:5]' } } }, 'postcss-loader', 'less-loader' ] } ] } } 核心原理 .css或.less文件樣式用普通css-loader 加載; .module.css或.module.less文件樣式開啓modules模塊化,並配置樣式class名字的生成規則; Webpack5 modules 配置如下: { loader: 'css-loader', options: { modules: { localIdentName: '[local]_[hash:base64:5]' } } }, Webpack4 modules 配置如下: { loader: 'css-loader', options: { sourceMap: false, importLoaders: 1, modules: true, localIdentName: '[local]_[hash:base64:5]' } },
localIdentName 是配置class名字的規則,[local]_[hash:base64:5]表示:用代碼裏的class名字+下劃線+5位hash值。

因爲hash值是隨機且唯一的,所以拼接之後的新名字也是唯一的,這就是css-modules防止樣式感染的原理。

注意:.css或.less文件與.module.css或.module.less文件分開配置,是爲了防止.css或.less文件裏的樣式也被混淆,否則如果代碼裏用到了className引用樣式,就會找不到。
所以需要使用css-modules的功能,需要將樣式文件命名成文件名.module.css等格式,作爲和純css文件的區分。

好了,又記完一坑,希望你能成功!

轉載:https://maomao.ink/index.php/IT/1569.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章