--- name: mpx2rn description: Mpx 跨端输出 RN(简称 Mpx2RN 或 Mpx2DRN)的开发适配指南,覆盖模板、脚本、样式、JSON 配置四大维度。当用户进行 Mpx2RN 相关任务时强制调用,包括但不限于:技术方案设计、页面 / 组件的开发迭代、旧项目跨端适配改造、编译和运行时报错排查、Code Review 等。当用户问题不涉及 Mpx2RN 时不应调用,如 Mpx 小程序开发问题,RN 原生开发问题、Mpx2Web 相关问题等。 metadata: version: "2.12.7" author: donghongping --- # Mpx 跨端输出 RN 开发与适配指南 ## 背景介绍 Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展支持的跨端开发框架,支持将同一套代码输出到小程序(微信、支付宝、百度等)、Web 和 React Native 平台。Mpx2RN 在编译时和运行时对模板、脚本、样式与 JSON 配置四大维度的开发能力进行了全面抹平,但与小程序、Web 平台仍存在一定能力差异。 ### 适用场景 本 SKILL 是 Mpx2RN 开发适配的统一指南,覆盖模板、脚本、样式、JSON 配置四大维度。涉及 Mpx2RN 的任务均应在动笔前阅读本 SKILL 的 [Mpx2RN 跨端开发约束](#mpx2rn-跨端开发约束),包括但不限于: - **技术方案设计**:评估需求在 RN 平台的可行性、跨端兼容方案选型、是否需要文件级条件编译或混合开发等; - **旧项目跨端适配改造**:对已基于小程序规范编写、未适配 RN 的存量组件进行兼容性补齐(参见下文[任务一](#任务一对小程序-mpx-组件进行-rn-跨端适配改造)); - **页面 / 组件开发迭代**:从零编写或迭代符合 RN 跨端兼容规范的 `.mpx` 页面与组件(参见下文[任务二](#任务二创建符合-rn-跨端兼容规范的-mpx-组件)); - **编译和运行时报错排查**:定位 RN 平台特有的编译错误(如样式空选择器、保留关键字、缩进敏感预处理器报错等)与运行时差异; - **Code Review**:以本 SKILL 的 [Mpx2RN 跨端开发约束](#mpx2rn-跨端开发约束)为标准对照检查跨端兼容性。 ### 不适用场景 以下场景与 Mpx2RN 无关,**不应调用**本 SKILL: - 仅面向小程序平台(微信、支付宝、百度等)的 Mpx 开发问题; - React Native 原生开发问题(不经 Mpx 编译的纯 RN 项目); - Mpx 跨端输出 Web(Mpx2Web)相关问题。 ## 知识库索引 | 知识库 | 说明 | | --- | --- | | [项目结构与单文件组件](./references/project-structure-and-single-file-component.md) | Mpx 项目的典型目录、页面与组件注册关系,以及 `.mpx` 单文件组件的基本结构与语法 | | [条件编译](./references/conditional-compile.md) | 模板、脚本、样式、JSON 等不同部分的条件编译语法,遇到无法跨端等效实现需分平台处理时读取 | | [跨端输出 RN 模板能力参考](./references/rn-template-reference.md) | 模板部分跨端能力详情:数据绑定、模板指令、事件、Slot、WXML 模板、i18n、无障碍访问、基础组件清单及其属性/事件支持情况 | | [跨端输出 RN 脚本能力参考](./references/rn-script-reference.md) | 脚本部分跨端能力详情:构造选项、生命周期、实例方法/属性、组合式 API、运行时导出、状态管理 | | [跨端输出 RN 编译与运行时配置参考](./references/rn-config-reference.md) | `MpxWebpackPlugin` 编译选项、编译期 `rnConfig` 与运行时 `Mpx.config` / `Mpx.config.rnConfig`;配置目标平台、基础组件替换、分包、导航或宿主能力时读取 | | [跨端输出 RN 样式能力参考](./references/rn-style-reference.md) | 样式部分跨端能力详情:选择器、单位、颜色、文本继承、CSS 变量、媒体查询、动画、背景图与逐项样式属性支持情况;明确查询某项样式能力是否支持时直接读取 | | [跨端输出 RN 样式开发最佳实践](./references/rn-style-practice.md) | 常用选择器与样式属性的跨端兼容方案;样式适配或开发时优先读取并直接应用命中的场景,未命中时再查样式能力参考 | | [Mpx2RN 原子 CSS 能力参考](./references/rn-atomic-css.md) | 基于 UnoCSS 的 RN 原子类接入、工具类、variants、directives 与 variant groups 支持范围、颜色透明度约束及编译排查;项目启用原子类或任务涉及 utility class 时读取 | | [跨端输出 RN 环境 API 参考](./references/rn-api-reference.md) | `@mpxjs/api-proxy` 提供的环境 API 跨端支持情况,涉及网络、存储、界面、设备、媒体、位置等 | | [跨端输出 RN JSON 配置参考](./references/rn-json-reference.md) | 应用、页面、组件三层 JSON 配置在 RN 平台的支持范围与差异 | | [Mpx 与 RN 混合开发](./references/rn-hybrid-dev.md) | 在 `.mpx` 内直接使用 React Native 组件、Hooks 的方式与跨端隔离方案 | ### 知识库使用建议 参考文档体量较大,**不要一次性预读全部参考**,按需取用即可: 1. **固定入口**:完整读取本 `SKILL.md`;不要在动笔前预读 references 目录,完成实现后重新按本 SKILL 的跨端开发约束逐项核实。 2. **触发式读取**:只在任务流程或跨端开发约束中**明确指向**某份参考时读取,且仅读取与当前问题相关的小节(参考文档均含目录与章节锚点,使用 grep / 锚点跳读,不要整文件 Read)。 3. **典型任务的最小阅读集**(仅当本 SKILL 已无法判断时再补充): - 已有组件 RN 跨端适配改造:识别问题维度后再读对应能力参考的相关小节,通常 1–2 份足够(如样式改造主要查 `rn-style-practice.md`)。 - 新建 RN 跨端兼容组件:先按本 SKILL 的跨端开发约束起手,遇到能力存疑(某属性是否支持、某 API 是否存在)时再点查对应参考。 - 排查特定编译报错:直接定位到报错维度的能力参考相关小节。 - 使用或排查原子类:读取 `rn-atomic-css.md`;仅需核对底层样式属性时再补读 `rn-style-reference.md`,不要预读全部样式参考。 4. **样式参考的读取顺序**:样式适配或开发时,优先读取 `rn-style-practice.md` 的相关小节,存在命中场景则直接应用;未命中相关内容时,再读取 `rn-style-reference.md` 的相关小节获取更广泛的知识参考。只有当任务明确查询某项样式能力是否支持时,才直接读取 `rn-style-reference.md`。 5. **何时读取 `project-structure-and-single-file-component.md`**:仅当不熟悉 Mpx 项目结构、页面与组件注册关系或 SFC 基本结构时读取;已熟悉相关写法可跳过。 ## Mpx2RN 跨端开发约束 无论是适配改造、新建组件还是 Code Review,都应遵循以下约束。开始实现前以本节指导开发,完成实现后再按本节逐项核实。 ### 跨平台兼容约束 产物代码须在原平台与 RN 平台均能正常运行。引入 `numberOfLines@ios|android|harmony`、`hairlineWidth` 等仅 RN 生效的写法时,通过条件编译限定在 RN 输出,并同步保留原平台原有写法,避免 RN 适配造成原平台行为退化。 ### 模板开发约束 1. **基础组件优先**:仅使用[模板能力参考 · 基础组件](./references/rn-template-reference.md#基础组件)中标注 RN 支持的基础组件、属性与事件;不支持项通过模板条件编译隔离。若用户通过 `rnConfig.customBuiltInComponents` 扩展了能力,以用户说明为准。 2. **页面滚动**:RN 页面默认不可滚动,`onPullDownRefresh` / `onReachBottom` / `onPageScroll` 不会触发;需要滚动时使用 `scroll-view` 及其等效能力。 3. **事件冒泡与捕获**:仅对基础通用事件 `tap` / `longpress` / `touchstart` / `touchmove` / `touchend` / `touchcancel` 使用冒泡和捕获语义。 4. **模板内方法调用**:模板 Mustache 表达式不调用普通方法,相关逻辑使用 `computed` / `wxs` 实现;i18n 翻译函数除外。 5. **i18n 函数命名**:组合式 API 中 `useI18n()` 解构出的翻译函数以原名 `t` / `tc` / `te` / `tm` 暴露给模板,不要重命名。 6. **事件传参**:自定义参数优先通过内联传参语法(如 `bindtap="handleTap('param')"`)传递,不要使用 `data-` dataset 属性绕行传参。 7. **文字节点**:文字内容优先由 `text` 显式包裹,避免依赖框架为 `view` 中的裸文字补节点;跨平台布局对齐方案见[样式开发最佳实践 · text 跨平台布局对齐](./references/rn-style-practice.md#text-跨平台布局对齐)。 8. **动态样式绑定**:动态 `class` / `style` 使用 `wx:class` / `wx:style` 指令,不要在属性值内使用 `{{}}` 拼接。 9. **selector 映射**:selector 类 API 引用的模板节点须声明空 `wx:ref`,完成编译期映射。 ### 脚本开发约束 1. **生命周期与构造选项**:仅使用[逻辑能力参考](./references/rn-script-reference.md)中标注 RN 支持的生命周期、构造选项和实例方法;`onShareTimeline` / `onTabItemTap` / `onAddToFavorites` / `onSaveExitState` 等无默认驱动的声明须由业务提供适配并通过 [`implement` 登记](./references/rn-script-reference.md#通过-implement-适配),或使用 `remove: true` 移除,不得仅登记便视为能力已实现。 2. **环境 API**:统一通过 `@mpxjs/api-proxy` 提供的 `mpx.xxx` 调用环境能力,不要直接使用 `wx.xxx` / `my.xxx`;具体支持范围以[环境 API 参考](./references/rn-api-reference.md)为准。若用户通过 `custom` 配置扩展了能力,以用户说明为准。 3. **Promise 化调用**:`@mpxjs/api-proxy` 开启 `usePromise` 时,参与 Promise 化的异步 API 必须使用 `await` 或 `.then()` / `.catch()`,不得传入 `success` / `fail` 回调。详见[环境 API 参考 · Promise 化](./references/rn-api-reference.md#使用说明)。 4. **selector API**:`selectComponent` / `selectAllComponents` / `createSelectorQuery` / `createIntersectionObserver` 等 selector API 仅使用 `#id` / `.class`,且对应模板节点须声明空 `wx:ref`。详见[逻辑能力参考 · 页面 / 组件实例方法与属性](./references/rn-script-reference.md#页面--组件实例方法与属性)。 5. **保留关键字**:挂载到实例上的数据 key(包括 `props` / `data` / `computed` / `methods` / `setup return` / `inject` 等)不得使用 `id` / `dataset` / `data`,避免触发 `reserved keyword of miniprogram` 错误。 6. **`