【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
  }
相关推荐
网络点点滴3 分钟前
NPM 和 package.json 文件简介
前端·npm·json
青木9603 分钟前
前后端开发调试运行技巧
linux·服务器·前端·后端·npm·uv
幻影七幻5 分钟前
js中send的作用和使用 $.ajax的作用
开发语言·前端·javascript
Rabbit_QL6 分钟前
npm 不是“前端的包管理器“—它是 Node.js 的
前端·npm·node.js
jinanwuhuaguo16 分钟前
OpenClaw执行奇点——因果链折叠与责任悬置的时间哲学(第十九篇)
前端·人工智能·安全·重构·openclaw
为美好的生活献上中指21 分钟前
本地虚拟机部署redis集群
前端·redis·ubuntu·bootstrap·html·redis集群
ConardLi39 分钟前
开源我的 GPT-Image2 生图 Skill,附大量玩法指南
前端·人工智能·后端
我是Superman丶44 分钟前
Antigravity Retry 自动重试脚本
前端·javascript·vue.js
是大强1 小时前
nvm安装node成功npm失败
前端·npm·node.js
\xin1 小时前
pikachu自编CSRF(GET),CSRF(POST),CSRF(token)
前端·csrf