packages/plugin-rax-compat/README.md
An ice.js plugin for migrating rax-app projects.
Add plugin in ice.config.mts:
import { defineConfig } from 'ice';
import compatRax from '@ice/plugin-rax-compat';
export default defineConfig(() => ({
plugins: [compatRax({ /* options */ })],
}));
inlineStylefalse.cssModuletrueinlineStyle enabled and cssModule disabled, process CSS Module files to inline included styles(not recommended).legacyfalsev0.6:import Rax from 'rax';
Rax.createContext();
这个插件将会处理这些兼容逻辑:
类型定义,Rax 中的类型定义来自于 React 16.8 前,与 React 18 的类型定义存在一些差异。
别名,将组成 rax 核心逻辑的 rax- 包,如 rax-children 等,映射到 rax-compat 的内部实现。
JSX,插件内部将基于源码类型来调整 swc 的编译配置。
@jsx createElement annotation 时,将设置 jsx runtime 为 classic。样式,在启用 inlineStyle 时,插件内部将额外处理行内样式逻辑。
首先,JSXClassNameTransformer 会将源码中的 <div className="header" /> 的写法转换为 <div style={styleSheet.header} />。
- 注意,只有项目源码内的代码才会被转换。
- 注意,`<div className={'xxx'} />` 这样的写法不会被转换。
- 注意,`import './x.module.css'` 这样的写法不会被转换。
接着,在 ClientSide,插件会覆盖原本的 Webpack Ruleset:
在 ServerSide,对命中了 inlineStyle 的资源文件,会使用 esbuild 进行处理为 styleSheet 对象(文件的类型会被改变为 JS 文件)。
关于行内样式的额外说明:
className="xxx" 的写法,才会被转换为 style={styleSheet.xxx} 的写法,因此 CSS Module 使用的 className={styles.xxx} 这种写法也不会被转换。另外,来自 node_modules 的代码不会被转换。