@@ -44,6 +44,15 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
4444
4545无论是适配改造还是新建组件,跨端兼容均需严格遵循以下通用约束:
4646
47+ ### 跨平台兼容约束
48+
49+ 产物代码须在原平台与 RN 平台均能正常运行。引入「RN 支持但原平台不支持」的写法(如 ` numberOfLines@ios|android|harmony ` / ` hairlineWidth ` 等 RN 等效实现)时,** 不要替换原平台已有写法** ,而应:
50+
51+ - 用条件编译将该 RN 写法限定在 RN 平台输出(模板属性后缀 ` @ios|android|harmony ` 、样式与脚本 ` @mpx-if ` 包裹等);
52+ - 同步用条件编译保留原平台原有写法,避免改造引入原平台行为退化。
53+
54+ 该原则贯穿模板 / 脚本 / 样式 / JSON 四个维度,下方各约束与样式约束 #3 的「双轨」条目即此原则的具体落地。
55+
4756### 模板(template)约束
4857
49581 . ** 基础组件优先** :使用 [ 模板能力参考 · 基础组件] ( ./references/rn-template-reference.md#基础组件 ) 中标注 RN 支持的基础组件与其支持属性/事件,不要使用 RN 不支持的属性或事件;如用户通过 ` rnConfig.customBuiltInComponents ` 编译配置扩充拓展了基础组件能力,以用户说明为准。
@@ -67,17 +76,20 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
67762 . ** 优先使用模板指令进行动态样式绑定** :使用 ` wx:class ` / ` wx:style ` 指令,避免在 ` class ` / ` style ` 属性内拼接 ` {{}} ` 插值表达式。
6877 - ** Bad Example** : ` <view class="item {{isActive ? 'active' : ''}}"> `
6978 - ** Good Example** : ` <view class="item" wx:class="{{ {active: isActive} }}"> `
70- 3 . ** 优先使用跨端兼容方案** :常见样式属性的跨端兼容方案见 [ 样式开发最佳实践] ( ./references/rn-style-practice.md ) ,包括:
71- - 复合选择器 → 等效单类选择器
72- - 子元素伪类(` :first-child ` 等)→ ` wx:class ` + ` index ` 判断
73- - 伪元素(` ::before ` / ` ::after ` )→ 真实节点替代
74- - 点击态伪类(` :active ` )→ ` hover-class ` / ` hover-stay-time `
75- - 1rpx 极细线 → ` hairlineWidth ` 条件编译
76- - ` rem ` / ` em ` → ` rpx `
77- - 数值型 ` font-weight ` → ` normal ` / ` bold `
78- - 文本溢出 → 模板属性 ` numberOfLines ` 条件编译
79- - 隐藏元素 → 尺寸归零 + ` overflow: hidden ` ,避免 ` display: none `
80- - ` grid ` / ` float ` → Flex 布局
79+ 3 . ** 优先使用跨端兼容方案** :常见样式属性的跨端兼容方案见 [ 样式开发最佳实践] ( ./references/rn-style-practice.md ) 。下表区分两类处理方式:
80+ - ** 等效替换** (替换后写法在原平台与 RN 平台均生效,可直接全平台使用)
81+ - 复合选择器 → 等效单类选择器
82+ - 子元素伪类(` :first-child ` 等)→ ` wx:class ` + ` index ` 判断
83+ - 伪元素(` ::before ` / ` ::after ` )→ 真实节点替代
84+ - 点击态伪类(` :active ` )→ ` hover-class ` / ` hover-stay-time `
85+ - ` rem ` / ` em ` → ` rpx `
86+ - 数值型 ` font-weight ` → ` normal ` / ` bold `
87+ - 隐藏元素:避免 ` display: none ` ,使用尺寸归零 + ` overflow: hidden `
88+ - ` grid ` / ` float ` → Flex 布局
89+ - ** 双轨保留** (原平台原写法用条件编译保留,RN 侧新增等效实现,** 禁止只保留 RN 一侧** )
90+ - 文本溢出:原平台保留 ` white-space ` / ` text-overflow ` / ` overflow: hidden ` 样式(用样式条件编译包裹整条规则),RN 侧通过模板属性 ` numberOfLines@ios|android|harmony ` 等效实现
91+ - 1rpx 极细线:原平台保留 ` 1rpx ` 边框写法(用样式条件编译),RN 侧用 ` hairlineWidth ` 等效
92+
81934 . ** 保留单位注释** :保留原始样式中的 ` /*use rpx*/ ` 与 ` /*use px*/ ` 注释,编译期会据此批量切换样式单位。
8294
8395### JSON 配置约束
@@ -160,12 +172,15 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
160172
161173#### 5 . 编译校验
162174
163- 完成上述改造后,使用 ` scripts/ compile- validate.js ` 对修改后的 ` .mpx ` 文件进行真实编译校验 ,参见下文 [编译校验脚本](#编译校验脚本)。若校验失败,按错误分类回到对应步骤进行修正。
175+ 完成上述改造后,使用本 skill 自带的编译校验脚本对修改后的 ` .mpx ` 文件进行真实编译校验(位于 skill 目录下的 ` scripts/ compile- validate.js `, ** 不在宿主项目根目录下 ** ) ,参见下文 [编译校验脚本](#编译校验脚本)。若校验失败,按错误分类回到对应步骤进行修正。
164176
165177#### 6 . 检查与确认
166178
167179按 SFC 各区块逐项核对,并确认条件编译与编译校验已收尾:
168180
181+ ** 跨平台兼容**
182+ - [ ] 引入的「RN 支持但原平台不支持」的写法均已通过条件编译限定在 RN 输出;原平台原有写法已用条件编译保留,未因 RN 适配而被替换或删除。
183+
169184** 模板(template)**
170185- [ ] `< template > ` 中使用的基础组件、属性、事件均在 [模板能力参考](./ references/ rn- template- reference.md ) 标注为 RN 支持,或已通过模板条件编译进行平台隔离;如用户通过 `rnConfig.customBuiltInComponents ` 编译配置扩充拓展了基础组件能力,以用户说明为准。
171186- [ ] 动态 `class` / `style ` 已改造为 `wx:class` / `wx:style ` 指令,未在属性值内使用 `{{}}` 拼接。
@@ -223,15 +238,17 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
223238
224239#### 3 . 编译校验
225240
226- 使用 `scripts/ compile- validate.js ` 校验新建组件,参见下文 [编译校验脚本](#编译校验脚本)。建议同时校验所有目标平台(如 `--target = wx,ios,web`),确保跨端兼容。
241+ 使用本 skill 自带的编译校验脚本(位于 skill 目录下的 `scripts/ compile- validate.js `, ** 不在宿主项目根目录下 ** ) 校验新建组件,参见下文 [编译校验脚本](#编译校验脚本)。建议同时校验所有目标平台(如 `--target = wx,ios,web`),确保跨端兼容。
227242
228243#### 4 . 检查与确认
229244
230245复用 [任务一 · 检查与确认](#6 - 检查与确认) 的清单,确认新建组件不引入任何 RN 不兼容写法。
231246
232247## 编译校验脚本
233248
234- `scripts/ compile- validate.js ` 是基于宿主项目 `@mpxjs / mpx- cli- service` 的真实编译校验工具,会自动从输入文件向上探测项目根目录、加载工程编译配置、按指定 `target` 进行编译,并按 `style / template / script / json / dependency / other` 分类聚合错误与警告。改造或新建组件后建议作为强制环节运行。
249+ > ** 脚本位置** :编译校验脚本随本 skill 一同分发,位于 ** skill 目录下** 的 `scripts/ compile- validate.js `(即 `< skill- root>/ scripts/ compile- validate.js `),下文所有命令示例均使用 ** 指向 skill 目录的路径** 调用该脚本,不要尝试在宿主项目根目录或 `node_modules` 中查找它。
250+
251+ 该脚本基于宿主项目内安装的 `@mpxjs / mpx- cli- service` 进行真实编译校验:会自动从输入 `.mpx ` 文件向上探测宿主项目根目录、加载工程编译配置、按指定 `target` 进行编译,并按 `style / template / script / json / dependency / other` 分类聚合错误与警告。改造或新建组件后建议作为强制环节运行。
235252
236253子组件忽略策略按宿主项目 `@mpxjs / webpack- plugin` 版本自动切换:
237254
@@ -253,21 +270,23 @@ Mpx 是一个以微信小程序语法为基础、进行了类 Vue 语法拓展
253270
254271### 使用示例
255272
273+ > 下方示例中的 `< skill- root> ` 表示本 skill 在宿主环境中的实际安装路径(例如 `.agents / skills/ mpx- rn- dev- guide`、`.claude / skills/ mpx- rn- dev- guide` 或 `~/ .claude / skills/ mpx- rn- dev- guide` 等,以实际安装位置为准);调用时使用该绝对路径,不要在宿主项目根目录下查找 `scripts/ compile- validate.js `。
274+
256275```bash
257276# 单组件、默认 target= ios
258- node .agents / skills / mpx - rn - dev - guide / scripts/ compile- validate.js src/ components/ foo.mpx
277+ node < skill - root > / scripts/ compile- validate.js src/ components/ foo.mpx
259278
260279# 显式指定为页面(影响 entry 与 partialCompileRules 形态)
261- node .agents / skills / mpx - rn - dev - guide / scripts/ compile- validate.js src/ pages/ index.mpx --type = page --target = ios
280+ node < skill - root > / scripts/ compile- validate.js src/ pages/ index.mpx --type = page --target = ios
262281
263282# 跨端多目标校验
264- node .agents / skills / mpx - rn - dev - guide / scripts/ compile- validate.js src/ components/ foo.mpx --target = wx,ios,web
283+ node < skill - root > / scripts/ compile- validate.js src/ components/ foo.mpx --target = wx,ios,web
265284
266285# 输出结构化 JSON 便于二次处理
267- node .agents / skills / mpx - rn - dev - guide / scripts/ compile- validate.js src/ components/ foo.mpx --target = ios --json
286+ node < skill - root > / scripts/ compile- validate.js src/ components/ foo.mpx --target = ios --json
268287
269288# 同时递归校验子组件(默认行为是仅校验目标自身)
270- node .agents / skills / mpx - rn - dev - guide / scripts/ compile- validate.js src/ components/ foo.mpx --target = ios --no-ignore-sub-components
289+ node < skill - root > / scripts/ compile- validate.js src/ components/ foo.mpx --target = ios --no-ignore-sub-components
271290```
272291
273292校验失败时按错误的 ` category ` 字段回到对应任务步骤定位与修正问题,再次运行直至通过。
0 commit comments