【CSS】业界内CSS的实现方案

几个大的方向

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,导致样式不对

  • 上手成本

  • 文件体积线性增长

  • 基于cssom的插入优化和qiankun的冲突问题

业内解决方案

style-component

style-component

emotion

emotion

vanilla-extract

vanilla-extract

linaria

linaria

上述css in js方案通过编译时提取样式,解决运行时性能的问题

Atom CSS

业务解决方案

tailwindcss

能解决【文件体积线性增长】的问题,Tailwind适用于做对短快平的网站,因为他内置的设计元素好看又好用。定制版话可以 UnoCSS 或者Vailla Extract+SprinkLess

windicss

windicss

Atom CSS in JS

atomic-css-in-js这个应该是 Atom CSS 与CSS in js的结合体,在CSS in JS的基础上以 Atom CSS的形式输出

业内解决方案

Meta的stylex

微软的griffel

引用

思考

1、babel-plugin-import 究竟是在做一件什么事情

2、我们项目中在本地联调的时候会碰到,使用css modules的时候,加载顺序冲突的问题,很不稳定,切换下页面就好了。 比如期望是red,而不是默认的blue

css 复制代码
:global{
  .ant-button{
    color: red
  }
}

.ant-button{
    color: blue
  }
相关推荐
寧笙(Lycode)14 分钟前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
asqq816 分钟前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩38 分钟前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
Hejjon1 小时前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
小堃学编程2 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习
Wannaer2 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js
不灭锦鲤2 小时前
xss-labs靶场基础8-10关(记录学习)
前端·学习·xss
Bl_a_ck2 小时前
--openssl-legacy-provider is not allowed in NODE_OPTIONS 报错的处理方式
开发语言·前端·web安全·网络安全·前端框架·ssl
懒羊羊我小弟2 小时前
手写符合Promise/A+规范的Promise类
前端·javascript
互联网搬砖老肖2 小时前
Web 架构之负载均衡会话保持
前端·架构·负载均衡