几个大的方向
CSS modules
原理
编译的css的class会编译成一个海西字符串,在webpack的css-loader
中这样配置
js
{
test: /.css$/,
loader: "style-loader!css-loader?modules"
}
css-loader 默认哈希规则是 [hash:base64]
,也可以更改定制哈希样式
bash
{
test: /.css$/,
loader: "style-loader!css-loader?modules&localIdentName=[path][name]---[local]---[hash:base64:5]"
},
一些用法
全局作用域
css
.title {
color: red;
}
:global(.title) {
color: green;
}
这种方式不会被编译成哈希字符串,虽然经常用,但是不知道为啥,学到了学到了
显示的局部作用域语法
css
:local(.title) {
color: red;
}
:global(.title) {
color: green;
}
通常搭配预编译语言(如less/Sass),我们的方案是less+css module
,这应该也是使用最多的解决方案
问题
编译速度的问题,如何慢? css module 原理是什么为何慢?我们
CSS in JS
原理
我理解会在head部分动态插入style的方式,如
加的太多,必定会影响性能,有大佬尝试extract-css-webpack-plugin
提取单独的css解决
问题
-
运行时性能问题
动态用js生成style标签,有计算的消耗;js变大了,有额外的解析js文件的消耗;缓存命中的问题,这个不是很理解
-
和SSR兼容的问题
如果使用css in js的方式覆盖组件,会导致 css in js的方式遭遇antd,导致样式不对
-
上手成本
-
文件体积线性增长
业内解决方案
style-component
emotion
vanilla-extract
linaria
上述css in js方案通过编译时提取样式,解决运行时性能的问题
Atom CSS
业务解决方案
tailwindcss
能解决【文件体积线性增长】的问题,Tailwind适用于做对短快平的网站,因为他内置的设计元素好看又好用。定制版话可以 UnoCSS 或者Vailla Extract+SprinkLess
windicss
Atom CSS in JS
atomic-css-in-js这个应该是 Atom CSS 与CSS in js的结合体,在CSS in JS的基础上以 Atom CSS的形式输出
业内解决方案
Meta的stylex
微软的griffel
引用
-
1、去掉了monent、css 变量、babel-plugin-import(默认按需)减少了很大的体积? 2、 主题方案在CSS Variables 与 CSS-in-JS,选择了后者
思考
1、babel-plugin-import 究竟是在做一件什么事情
2、我们项目中在本地联调的时候会碰到,使用css modules的时候,加载顺序冲突的问题,很不稳定,切换下页面就好了。 比如期望是red,而不是默认的blue
css
:global{
.ant-button{
color: red
}
}
.ant-button{
color: blue
}