Summary
Mpx 跨端输出 RN(简称 Mpx2RN 或 Mpx2DRN)的开发适配指南,覆盖模板、脚本、样式、JSON 配置四大维度。当用户进行 Mpx2RN 相关任务时强制调用,包括但不限于:技术方案设计、页面 / 组件的开发迭代、旧项目跨端适配改造、编译和运行时报错排查、Code Review 等。当用户问题不涉及…
didi/mpx · Archived
Mpx 跨端输出 RN(简称 Mpx2RN 或 Mpx2DRN)的开发适?
Mpx 跨端输出 RN(简称 Mpx2RN 或 Mpx2DRN)的开发适配指南,覆盖模板、脚本、样式、JSON 配置四大维度。当用户进行 Mpx2RN 相关任务时强制调用,包括但不限于:技术方案设计、页面 / 组件的开发迭代、旧项目跨端适配改造、编译和运行时报错排查、Code Review 等。当用户问题不涉及…
This repository is archived — consider an actively maintained alternative.
Helps when network-related commands (like curl, git, npm, pip, brew) are failing, timing out, o…
20 installs通过查看当前最新版本与上一版本间的git提交记录与代码变更,生成版本变更日志,当用户询问“创建/生成…
18 installsmarkdown文档编辑时,为标题添加简单的哈希锚点,当用户提到添加简单哈希锚点时强制调用。
17 installsOther skills from didi/mpx.
npx skills add didi/mpx
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
master
Parsed from SKILL.md frontmatter.
Files included with this skill beyond the listing page.
SKILL.md
26,499 B
SUMMARY.md
488 B
Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展支持的跨端开发框架,支持将同一套代码输出到小程序(微信、支付宝、百度等)、Web 和 React Native 平台。Mpx2RN 在编译时和运行时对模板、脚本、样式与 JSON 配置四大维度的开发能力进行了全面抹平,但与小程序、Web 平台仍存在一定能力差异。
本 SKILL 是 Mpx2RN 开发适配的统一指南,覆盖模板、脚本、样式、JSON 配置四大维度。涉及 Mpx2RN 的任务均应在动笔前阅读本 SKILL 的 [Mpx2RN 跨端开发约束](#mpx2rn-跨端开发约束),包括但不限于:
.mpx 页面与组件(参见下文[任务二](#任务二创建符合-rn-跨端兼容规范的-mpx-组件));以下场景与 Mpx2RN 无关,不应调用本 SKILL:
| 知识库 | 说明 |
|---|---|
| [项目结构与单文件组件](./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-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 的方式与跨端隔离方案 |
参考文档体量较大,不要一次性预读全部参考,按需取用即可:
SKILL.md;不要在动笔前预读 references 目录,完成实现后重新按本 SKILL 的跨端开发约束逐项核实。- 已有组件 RN 跨端适配改造:识别问题维度后再读对应能力参考的相关小节,通常 1–2 份足够(如样式改造主要查 rn-style-practice.md)。 - 新建 RN 跨端兼容组件:先按本 SKILL 的跨端开发约束起手,遇到能力存疑(某属性是否支持、某 API 是否存在)时再点查对应参考。 - 排查特定编译报错:直接定位到报错维度的能力参考相关小节。 - 使用或排查原子类:读取 rn-atomic-css.md;仅需核对底层样式属性时再补读 rn-style-reference.md,不要预读全部样式参考。
rn-style-practice.md 的相关小节,存在命中场景则直接应用;未命中相关内容时,再读取 rn-style-reference.md 的相关小节获取更广泛的知识参考。只有当任务明确查询某项样式能力是否支持时,才直接读取 rn-style-reference.md。project-structure-and-single-file-component.md:仅当不熟悉 Mpx 项目结构、页面与组件注册关系或 SFC 基本结构时读取;已熟悉相关写法可跳过。无论是适配改造、新建组件还是 Code Review,都应遵循以下约束。开始实现前以本节指导开发,完成实现后再按本节逐项核实。
产物代码须在原平台与 RN 平台均能正常运行。引入 numberOfLines@ios|android|harmony、hairlineWidth 等仅 RN 生效的写法时,通过条件编译限定在 RN 输出,并同步保留原平台原有写法,避免 RN 适配造成原平台行为退化。
rnConfig.customBuiltInComponents 扩展了能力,以用户说明为准。onPullDownRefresh / onReachBottom / onPageScroll 不会触发;需要滚动时使用 scroll-view 及其等效能力。tap / longpress / touchstart / touchmove / touchend / touchcancel 使用冒泡和捕获语义。computed / wxs 实现;i18n 翻译函数除外。useI18n() 解构出的翻译函数以原名 t / tc / te / tm 暴露给模板,不要重命名。bindtap="handleTap('param')")传递,不要使用 data- dataset 属性绕行传参。text 显式包裹,避免依赖框架为 view 中的裸文字补节点;跨平台布局对齐方案见[样式开发最佳实践 · text 跨平台布局对齐](./references/rn-style-practice.md#text-跨平台布局对齐)。class / style 使用 wx:class / wx:style 指令,不要在属性值内使用 {{}} 拼接。wx:ref,完成编译期映射。onShareTimeline / onTabItemTap / onAddToFavorites / onSaveExitState 等不支持项不得直接用于 RN 产物。@mpxjs/api-proxy 提供的 mpx.xxx 调用环境能力,不要直接使用 wx.xxx / my.xxx;具体支持范围以[环境 API 参考](./references/rn-api-reference.md)为准。若用户通过 custom 配置扩展了能力,以用户说明为准。@mpxjs/api-proxy 开启 usePromise 时,参与 Promise 化的异步 API 必须使用 await 或 .then() / .catch(),不得传入 success / fail 回调。详见[环境 API 参考 · Promise 化](./references/rn-api-reference.md#使用说明)。selectComponent / selectAllComponents / createSelectorQuery / createIntersectionObserver 等 selector API 仅使用 #id / .class,且对应模板节点须声明空 wx:ref。详见[逻辑能力参考 · 页面 / 组件实例方法与属性](./references/rn-script-reference.md#页面--组件实例方法与属性)。props / data / computed / methods / setup return / inject 等)不得使用 id / dataset / data,避免触发 reserved keyword of miniprogram 错误。<script setup> 显式暴露:模板引用的数据与方法须通过 defineExpose() 显式声明,不要暴露模板未使用的大型 store、RN 原生对象等无 UI 数据。calc()、媒体查询、rpx、颜色格式和文本继承等能力无需额外替换或条件编译。<template> 与 <script> 中的引用。逗号分隔的并列单类选择器可以直接使用。wx:class / wx:style 指令,不要在 class / style 属性中拼接 {{}} 插值表达式。enable-var / enable-text-pass-through / enable-background / enable-animation 在首次渲染时预声明;hover-class 的存在状态和 enable-animation 的动画类型在同一组件实例生命周期内保持稳定。仅普通值变化且能力类型始终存在时无需冗余预声明。详见[样式开发最佳实践 · 按需样式能力预声明](./references/rn-style-practice.md#按需样式能力预声明)。key / wx:key;无法提供时,按所有可能能力的并集在每个可能复用的节点上添加 enable-* 预声明,避免复用前后改变 Hook 调用。- 等效替换:适配方案在原平台与 RN 平台均生效时,直接在全平台应用;例如将复合选择器改为等效单类选择器、将伪元素改为真实节点、将 grid / float 改为 Flex 布局。 - 双轨保留:适配方案仅在 RN 侧生效无法在原平台生效时,通过条件编译保留原平台原写法,禁止只保留 RN 侧。例如文本溢出在原平台保留原样式、RN 侧使用 numberOfLines@ios|android|harmony;1rpx 极细线在原平台保留 1rpx 边框、RN 侧使用 hairlineWidth。
/use rpx/ 与 /use px/ 注释,编译期会据此批量切换样式单位。safelist;颜色透明度使用 bg-red-500/50 等斜杠 alpha 语法,不要使用独立 -opacity- 组合。margin 简写与长写。仅对确认在原平台发生折叠且同一间距由两侧共同表达的节点,将折叠后的有效间距归到单侧;先排除 Flex / Grid、浮动、position: absolute/fixed、clearance、父子关系中的 BFC 与分隔条件、空块阻断条件等不折叠场景,无法确认时保持原样。详见[样式开发最佳实践 · 处理垂直 margin 折叠](./references/rn-style-practice.md#处理垂直-margin-折叠)。tabBar 等不支持字段通过条件编译隔离。<script name="json"> 并通过 __mpxmode / mpxenv__ 动态生成。disableScroll 设为 true,样式声明 page { height: 100%; },并使用开启 scroll-y 的 scroll-view 承载滚动内容。- 原平台条件根据用户项目配置确定,一般为
__mpxmode === 'wx' || mpxmode === 'ali' || mpx_mode__ === 'web'。
- RN 平台条件根据用户项目配置确定,一般为__mpxmode === 'ios' || mpxmode === 'android' || mpx_mode__ === 'harmony'。
expected "indent", got "outdent" 等错误。/ @mpx-if (...) /,模板使用 wx:if="{{...}}" 或 @mode 属性后缀,脚本和 JSON 使用 if (__mpx_mode__ === ...);新增代码不要使用历史兼容语法 @_mode。详见[条件编译](./references/conditional-compile.md)。<template> 中使用的基础组件及其属性与事件逐一核对 RN 支持情况。class / style 是否使用了 {{}} 拼接字符串,统一改造为 wx:class / wx:style 指令绑定。<script> 中 selector 类 API 引用的节点是否声明空 wx:ref,未声明的须补齐。@mode / mpxTagName@mode)进行平台隔离,并添加 todo 注释记录差异原因。<script> 中的生命周期、构造选项、实例方法与环境 API 调用逐一核对 RN 支持情况。wx.xxx / my.xxx)统一替换为 mpx.xxx 接入 @mpxjs/api-proxy 抹平的实现。#id / .class 写法,并在对应模板节点添加空 wx:ref。todo 注释记录差异原因。sass / less / stylus 等支持嵌套写法的预处理语言,先将 <style> 中的嵌套选择器展开铺平为传统选择器写法,便于后续兼容性判断。<template> 与 <script> 中的类名引用。<style>、<template>、<script> 中命中的样式场景直接改造为跨端兼容的等效实现;未命中相关内容时,再读取 [样式能力参考](./references/rn-style-reference.md) 的相关小节获取更广泛的知识参考。明确需要查询某项样式能力是否支持时,直接读取样式能力参考。<template> 中的实际相邻关系审计垂直 margin,并展开理解 margin 简写以及 margin-top / margin-bottom 长写。先按 [样式开发最佳实践 · 处理垂直 margin 折叠](./references/rn-style-practice.md#处理垂直-margin-折叠) 的反向约束排除 Flex / Grid、浮动、position: absolute/fixed、clearance,以及父子关系中的 BFC 与分隔条件;仅当确认原平台会发生 margin 折叠且同一间距由两侧共同表达时,才归到单侧并保留原平台折叠后的有效间距,避免 RN 将两侧数值叠加。不要只检查属性是否受 RN 支持,因为 margin 本身受支持但布局语义不同。todo 注释记录差异原因。<script type="application/json"> 或 <script name="json"> 中所用字段在 RN 平台的支持情况。<script name="json"> 形式,借助 __mpx_mode__ 进行 [配置条件编译](./references/conditional-compile.md#配置条件编译)。npx eslint path/to/component.mpx),无 lint 错误与警告。- 平台差异较大:使用文件维度条件编译(hybrid-card.mpx / hybrid-card.ios.mpx),在独立文件中引入 react-native 依赖,避免原平台构建解析。 - 局部差异较小:使用模板/属性维度条件编译(@mode / mpxTagName@mode)隔离 RN 专属属性或少量节点。
按 SFC 四个区块依次实现,全程遵循 [Mpx2RN 跨端开发约束](#mpx2rn-跨端开发约束):
<template>:读取 [模板能力参考](./references/rn-template-reference.md),仅选用 RN 支持的基础组件、属性与事件;动态样式类名绑定使用 wx:class / wx:style;selector 类 API 涉及节点声明空 wx:ref。<script>:读取 [逻辑能力参考](./references/rn-script-reference.md) 与 [环境 API 参考](./references/rn-api-reference.md),仅使用 RN 支持的生命周期、构造选项与 API;统一通过 mpx.xxx 调用环境能力。- 优先使用组合式 API:新建组件优先使用 <script setup> 风格的组合式 API 编写逻辑,生命周期须在 <script setup> 顶层同步注册,详见 [逻辑能力参考 · 组合式 API](./references/rn-script-reference.md#组合式-api)。 - 状态管理优先使用 @mpxjs/pinia:新项目、新状态域或与组合式 API 协同时,使用 @mpxjs/pinia(Pinia 风格);仅当工程已深度使用 @mpxjs/store(Vuex 风格)时继续维护沿用,避免同一业务域两套方案并存。详见 [逻辑能力参考 · 状态管理](./references/rn-script-reference.md#状态管理)。
<style>:优先读取 [样式开发最佳实践](./references/rn-style-practice.md),从一开始就应用其中命中的单类选择器、Flex 布局、rpx 单位、hover-class 等跨端兼容写法;未命中相关内容时,再读取 [样式能力参考](./references/rn-style-reference.md) 的相关小节。明确需要查询某项样式能力是否支持时,直接读取样式能力参考。项目启用 UnoCSS 时再读取 [Mpx2RN 原子 CSS 能力参考](./references/rn-atomic-css.md),只使用 RN 支持的工具类与 variants。<script name="json"> 形式动态生成。脚本位置:编译校验脚本随本 skill 一同分发,位于 skill 目录下 的
scripts/compile-validate.js(即<skill-root>/scripts/compile-validate.js),下文所有命令示例均使用 指向 skill 目录的路径调用该脚本,不要尝试在宿主项目根目录或node_modules中查找它。
该脚本基于宿主项目内安装的 @mpxjs/mpx-cli-service 进行真实编译校验:会自动从输入 .mpx 文件向上探测宿主项目根目录、加载工程编译配置、按指定 target 进行编译,并按 style / template / script / json / dependency / other 分类聚合错误与警告。默认通过前置 loader 从目标文件中剥离 usingComponents,不解析或编译子组件,仅验证目标 .mpx 文件本身;因此默认不会校验子组件路径与配置。改造或新建组件后建议作为强制环节运行。
| 参数 | 默认 | 说明 | |
|---|---|---|---|
<file.mpx>... |
- | 一个或多个待校验的 .mpx 绝对/相对路径 |
|
--target=<mode> |
ios |
编译目标,多个用逗号分隔(如 wx,ios,web) |
|
| `--type=<page\ | component>` | component |
入口类型,决定使用 getPageEntry 还是 getComponentEntry |
--project-root=<path> |
自动探测 | 显式指定宿主项目根目录 | |
--no-ignore-sub-components |
关闭 | 保留 usingComponents,解析并递归编译所有子组件 |
|
--json |
关闭 | 输出结构化 JSON 结果 |
退出码:0 校验通过(无错误、无警告);1 存在编译错误或警告;2 运行期异常(如未找到 @mpxjs/mpx-cli-service)。
下方示例中的
<skill-root>表示本 skill 在宿主环境中的实际安装路径(例如.agents/skills/mpx2rn、.claude/skills/mpx2rn或~/.claude/skills/mpx2rn等,以实际安装位置为准);调用时使用该绝对路径,不要在宿主项目根目录下查找scripts/compile-validate.js。
# 单组件、默认 target=ios
node <skill-root>/scripts/compile-validate.js src/components/foo.mpx
# 显式指定为页面
node <skill-root>/scripts/compile-validate.js src/pages/index.mpx --type=page --target=ios
# 跨端多目标校验
node <skill-root>/scripts/compile-validate.js src/components/foo.mpx --target=wx,ios,web
# 输出结构化 JSON 便于二次处理
node <skill-root>/scripts/compile-validate.js src/components/foo.mpx --target=ios --json
# 同时递归校验子组件(默认行为是仅校验目标自身)
node <skill-root>/scripts/compile-validate.js src/components/foo.mpx --target=ios --no-ignore-sub-components
校验失败时按错误或警告的 category 字段回到对应任务步骤定位与修正问题,再次运行直至无错误、无警告。