Skip to content

在Mpx RN 环境中使用原子类

Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目也可以使用原子类。如果要在你的项目当中集成原子类的能力,具体操作请参照接入文档。

受限于 RN 平台的样式规则能力限制,绝大部分的 unocss 提供的原子类并不能在跨 RN 项目当中使用,以下是目前所支持的原子类:

对于不支持的原子类,在项目编译构建阶段会将不支持的原子类以 error 形式提示,且最终的编译产物当中不会产出对应的原子类结果

Typography

规则是否支持备注
Font family
Font size
Font style
Font weight
Font Variant Numberic
Hyphens
Letter spacing
Line height
Tab size
Text alignment
Text color
Text decoration
Text decoration styleios 支持 安卓不支持
Text decoration thickness
Text underline offset
Text decoration opacity
Text indent
Text opacity
Text shadow
Text stroke
Text stroke color
Text transform
Vertical alignment安卓支持,ios 不支持,且只支持 auto/top/bottom/center
White space
Word break
Write mode
Writing orientation

Svg

不支持

Variants

  • Screen Variants

Mobile First

Varaint规则备注
sm@media (min-width: 640px)
md@media (min-width: 768px)
lg@media (min-width: 1024px)
xl@media (min-width: 1280px)
2xl@media (min-width: 1536px)

Desktop First

Varaint规则备注
<sm@media (max-width: 640px)
<md@media (max-width: 768px)
<lg@media (max-width: 1024px)
<xl@media (max-width: 1280px)
<2xl@media (max-width: 1536px)

Only Screen

Varaint规则备注
@sm@media (min-width: 640px) and (max-width: 768px)
@md@media (min-width: 768px) and (max-width: 1024px)
@lg@media (min-width: 1024px) and (max-width: 1280px)
@xl@media (min-width: 1280px) and (max-width: 1536px)
@2xl@media (min-width: 1536px)
  • Pseudo Elements

目前仅支持 hover

  • Theme Variants
Varaint规则备注
dark暗色模式
light亮色模式
  • Orientation Variants
Varaint规则备注
portrait竖屏
landscape横屏

Screen Readers

不支持

Animation

不支持

Transforms

规则是否支持备注
Transform Type
Transform Origin
Transform Rotate
Transform Scale
Transform Skew
Transform Translate
Perspective
Perspective Origin

Transitions

不支持

Background

规则是否支持备注
Background attachment
Background clip
Background color
Background opacity
Background position支持 left/right/top/bottom/center/数值
Background repeat仅支持 no-repeat
Background size
Background origin
Background Image

Gradients

规则是否支持备注
Gradient Direction
Gradient From
Gradient Via
Gradient To

Background Blend Mode

不支持

不支持

Box Decoration Break

不支持

Image Rendering

不支持

Listing

规则是否支持备注
List style type
List style position
List style image

Overflow

仅支持 hiddenscrollvisible 属性值

Overflow Behavior

不支持

Placeholder

不支持

Border

规则是否支持备注
Border radius不支持 border-inline-start、border-inline-end、border-block-start、border-block-end 属性,其他都支持
Border width
Border color
Border opacity
Border style不支持 double,hidden 样式,其他都支持

Divider

规则是否支持备注
Divider width
Divider color
Divider opacity
Divider style

Outline

规则是否支持备注
Outline Width
Outline Color
Outline solid
Outline dotted

Ring

规则是否支持备注
Ring width
Ring color
Ring opacity
Ring offset width
Ring offset color

Box Shadow

规则是否支持备注
Box shadow size
Box shadow color

Opacity

支持

Mix Blend Mode

不支持

Filter

RN 0.76 支持,且存在机型的兼容性问题,具体参见 RN 官方文档

规则是否支持备注
Filter blur
Filter brightness
Filter contrast
Filter drop shadow
Filter grayscale
Filter hue rotate
Filter invert
Filter saturate
Filter Sepia

Backdrop Filter

不支持

规则是否支持备注
Backdrop blur
Backdrop brightness
Backdrop contrast
Backdrop drop shadow
Backdrop grayscale
Backdrop hue rotate
Backdrop invert
Backdrop saturate
Backdrop Sepia

Accent Color

不支持

Appearance

部分支持(backface-visible,backface-hidden)

Cursor

不支持,TextInput 有属性控制

Caret

规则是否支持备注
Caret Color
Caret Opacity

Pointer Events

部分支持(auto,none)

Resize

不支持

Scroll Behavior

不支持

Touch Action

不支持

User Select

支持(none,auto,all,text)

Will Change

不支持

Columns

不支持

Container

不支持

Display

规则是否支持备注
Block
Inline Block
Inline
Flow Root
Contents
Hidden
Visibility
Visibility
Backface Visibility
List Item

Flexbox

规则是否支持备注
Flex
Flex Basis
Inline Flex
Flex Direction
Flex Wrap
Flex Stretch
Flex Grow
Flex Shrink

Grid

不支持

Positioning

规则是否支持备注
Justify Content只支持(justify-around,justify-between,justify-center,justify-end,justify-evenly,justify-start)
Justify Items
Justify Self
Align Content
Align Items
Align Self
Place Content
Place Items
Place Self
Position只支持(absolute,relative)
Top / Right / Bottom / Left
Floats
Clear
Isolation
Object Fit
Object Position
Z-Index

Sizing

规则是否支持备注
Width
Min-Width
Max-Width
Min-Height
Max-Height
Box Sizing

Spacing

规则是否支持备注
Padding
Padding Y
Padding X
Padding Top
Padding Left
Padding Bottom
Padding Right
Margin
Margin Y
Margin X
Margin Top
Margin Left
Margin Bottom
Margin Right
Space Between Y
Space Between Y Reverse
Space Between X
Space Between X Reverse

Tables

不支持

RN 端颜色透明度写法约束

背景

unocss 默认实现为了支持「单色 utility + 独立 opacity utility」的组合(如 bg-red-500 + bg-opacity-50),会强制把颜色拆成两个 CSS 变量:

css
.bg-red-500 {
  --un-bg-opacity: 1;
  background-color: rgb(239 68 68 / var(--un-bg-opacity));
}
.bg-opacity-50 {
  --un-bg-opacity: 0.5;
}

在浏览器上这套机制几乎免费,但在 RN 端经由 mpx-runtime 解析时,会带来三块额外开销:

  1. 每个颜色 utility 多 1 个 styleObj key:从 { backgroundColor } 变成 { '--un-bg-opacity', backgroundColor },key 数量翻倍。
  2. 运行时多一轮 cssVar 解析useTransformStyle 中的 varVisitor 需要逐个组件实例扫描并替换 var(--*) 引用。
  3. layer 抽离开销:「全是 --un-*」的 utility 会被推到 varUtilities layer,运行时多一次 mergeToLayer 合并。

实测在 1200 卡片的 perf 列表上,将颜色 utility 的 cssVar 全部 inline 后,__getStyle 总耗时下降明显(从 ~700ms 降到 ~140ms 量级,与 stylus 持平)。

为此 @mpxjs/unocss-base/preset-rn 在编译期通过 postprocess 把所有颜色类 utility 中的 var(--un-*-opacity) / shadow 颜色 var 等全部 inline 为字面量,并丢弃配套的 --un-*-opacity 声明行。这是一项对业务有感知的破坏性优化,本节说明影响面与迁移方法。

影响范围与迁移

依赖「跨 utility cssVar 合成」的体系(transform / filter / backdrop-filter / gradient / ring)通过白名单完整保留,业务原有写法不受影响:

html
<!-- ✅ 保持原样可用 -->
<view class="transform translate-x-2 rotate-45 scale-110" />
<view class="filter blur-sm brightness-110 contrast-125" />
<view class="bg-gradient-to-r from-blue-500 to-purple-500" />

实际需要业务改写的只有「颜色 + 独立 opacity utility」组合一种场景。请改用 unocss 原生的 /{alpha} 斜杠语法(Web / RN 双端一致):

之前的写法(已不再生效)现在的写法
bg-red-500 bg-opacity-50bg-red-500/50
text-blue-600 text-opacity-30text-blue-600/30
border-gray-300 border-opacity-50border-gray-300/50

触发逻辑:独立 *-opacity-{n} utility 在 unocss 中只产出一行 --un-*-opacity: <n> 声明。该声明在 postprocess 中被剥离后 utility entries 为空,className 自然失效。

斜杠语法同样适用于其他颜色类(如 bg-red-500/30shadow-black/20),同色字面量 + alpha 通道直接内嵌为 rgba(...),运行时零开销。

渲染等价性

className改造前改造后
bg-red-500rgba(239,68,68,1)rgba(239,68,68,1) ≡ 同色
bg-red-500/50rgba(239,68,68,0.5)rgba(239,68,68,0.5) ≡ 同色
bg-red-500 bg-opacity-50rgba(239,68,68,0.5)rgba(239,68,68,1)(opacity utility 失效)
shadow-mdshadowColor #000 alpha 0.1

迁移完成后,所有颜色相关 utility 在产物中均为字面值字符串,运行时不再有 cssVar 解析与 varUtilities layer 合并开销。