css隔离方案----css-loader的css-module方案

98 阅读1分钟

利用css-loader进行css隔离方案

原理就是利用 css-loadercss-module方案进行, 可以将每个css类名进行单独配置, 同时将css类名一一对应到元素里面种

webpack 配置

// webpack.config.js
// module/rules/test:css
{
    loader: 'css-loader',
    options: {
        modules: {
        // 生产环境中直接使用base64的前20位, 用于隐藏css类名, 开发环境就不使用代码混淆
            localIdentName: isProduction ? '[hash:base64:20]' : '[local]',
        },
    }
},

页面使用

import appCss from './app.css';
const App = () => {
  return <div>
		<div className={appCss.bbb}>
			bbb
		</div>
		<div className={appCss.aaa}>
			aaa
		</div>
	</div>
}
export default App

打生产包

image.png

可以看到,利用css-module机制是可以成功进行css隔离,保证css的唯一性

注意点

modules.modeglobal配置会覆盖所有的css-module并使其失效, 如果将其设置为global

import appCss from './app.css';

这里面的appCss将会是一个空对象

modules.mode设置为local时, 如果任意文件的某个css值不想成为css-module, 那么就可以使用:global()进行包裹

例如

/* src/app.css */
:global(.ccc) {
  /* some styles */
	background-color: red;
}

// src/App.tsx
import appCss from './app.css';
const App = () => {
	console.log(appCss, "appCss");// 这里面是没有:global包裹的类名的
  return <div className='ccc'>
		<div className={appCss.bbb}>
			bbb
		</div>
		<div className={appCss.aaa}>
			aaa
		</div>
	</div>
}

export default App

image.png