emotion 配置
前言
emotion 是一个 css in js 的库, 有了它,我们就可以在 js 中写 css 了, 这样就可以把组件的样式和组件的逻辑放在一起,方便维护。ChakraUI 和 MUI 都是依赖它开发的组件。
特色
- css props
ts 配置
Emotion – TypeScript, 为了 tsc 能够识别, 需要修改 tsconfig.json
:
"jsx": "react-jsx",
"jsxImportSource": "@emotion/react"
转码工具中设置 importSource
这一步是为了编码之后的 jsx 函数, 能被 emotion 替换掉。
babel
修改 .babelrc
:
{
"presets": [
[
"@babel/preset-react",
{ "runtime": "automatic", "importSource": "@emotion/react" }
]
],
"plugins": ["@emotion/babel-plugin"]
}
swc
比如 vite 中:
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
react({
jsxImportSource: "@emotion/react",
}),
],
});
如果是 rspack 工程的话, 修改 rsbuild.config.ts
:
import { defineConfig } from "@rsbuild/core";
import { pluginReact } from "@rsbuild/plugin-react";
export default defineConfig({
plugins: [pluginReact()],
tools: {
rspack: {
module: {
rules: [
{
test: /\.tsx$/,
loader: "builtin:swc-loader",
options: {
jsc: {
transform: {
react: {
importSource: "@emotion/react",
runtime: "automatic",
},
},
},
rspackExperiments: {
emotion: true,
},
},
type: "javascript/auto",
},
],
},
},
},
});
esbuild
vite 生产环境构建,使用的就是 esbuild, 它自动处理读取了 tsconfig.json
中的 jsxImportSource
配置的。
技术总结
emotion 作为一个 css-in-js 的工具, 还是听方便的,特别是支持 css props 的写法, 让为 class 命名的烦恼远离了我们。
但随着 headlessUI + tailwindCSS 的方案发展,我后续也会倾向后者, 因为在和其他组件结合的时候, tailwindCSS 能快速的维护好样式。