简介
这是一次尝鲜使用的使用记录。
TL;DR
OpenProps通过强大的Css Variables来构建一致风格的组件(Html片段)
UnoCss,一个性能好,DX好的Atomic Css方案
两者之间的选择:
- 快速Prototyping选择OpenProps
- Pro:简单易用
- Con: 请求多,css variable的维护难易程度见仁见智
- 实际生产使用UnoCss
- Pro:Atomic Css
- Con:Atomic Css
OpenProps
使用
@import "https://unpkg.com/open-props/src/index.css";
button {
color: var(--blue-6);
font-size: var(--font-size-8);
font-family: var(--font-serif);
}
button.sans {
font-family: var(--font-sans);
}
打包产物如下:
var css_248z = `
@import \"https://unpkg.com/open-props/src/index.css\";
button{color:var(--blue-6);font-family:var(--font-serif);font-size:var(--font-size-8)}
button.sans{font-family:var(--font-sans)}
`;
styleInject(css_248z);
但是运行时会有以下请求。
产物优化
可使用postcss-jit-props
button {
color: var(--blue-6);
font-size: var(--font-size-8);
font-family: var(--font-serif);
}
button.sans {
font-family: var(--font-sans);
}
使用postcss-jit-props
可以做到按需引入
// postcss.config.js
const postcssJitProps = require('postcss-jit-props');
const OpenProps = require('open-props');
module.exports = {
plugins: [
postcssJitProps(OpenProps),
]
}
产物如下:
var css_248z = `
:root{--blue-6:#228be6;--font-size-8:3.5rem;--font-serif:ui-serif,serif;--font-sans:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif}
button{color:var(--blue-6);font-family:var(--font-serif);font-size:var(--font-size-8)}
button.sans{font-family:var(--font-sans)}
`;
styleInject(css_248z);
可以发现以上css variables被自动引入。对应没有使用到的css variables会被purge。
结论
- 参考仓库:
- 纯css variables类的css解决方案。
- 配合postcss-jit-props可做到按需。
- 没有什么槽点,要自定义有自定义且因为纯css variables没什么性能科研
UnoCss
又又又是一个atomic css解决方案
还是那些老生常谈的优点
- 定制化:config file配置
- 按需:基于atomic-css engine的css快捷生成
- @apply的原子化样式应用
- 等等等等。。
结论
- 参考仓库:
- 整体接入流程跟tailwindcss类似,参考官网即可。但是在rollup作为bundler下,启用watch mode,会出现构建产物失败问题。build就没有问题。
- 产物完全按需,性能没话说。tailwindcss、windicss平替。
- 生态工具及其夸张,就怕DX不到位,甚至做了dev inspector和runtime方案
- 文档上做的很好,atomic css就怕记不住一直要翻文档,unocss官网采用了搜索的方式 https://unocss.dev/interactive/?s=font-serif