# 微信小程序转 UniApp 详细迁移指南 > **⚠️ 核心规则提示** > 本项目的**核心强制规则**(如接口规范、工具类替代、样式单位等)已提取至根目录下的 `.cursorrules` 文件。 > 在进行代码转换时,AI 助手**必须优先遵循 .cursorrules** 中的指令。 > 本文档作为**详细参考手册**,提供具体的代码示例、复杂场景说明和完整的迁移背景。 ## 核心避坑指南 (详细版) 以下规则是 `.cursorrules` 的补充说明,包含具体代码示例: 1. **接口导入**:严禁使用 `config/api` 或相对路径引用接口。**必须**使用 `@/pagesPersonal/service/...` (分包) 或 `@/service/...` (主包)。 * **重要**:接口导入**必须**使用解构导入(Named Imports),严禁使用默认对象导入(`import service from ...`)。 * 示例:`import { updateAccountAuthList as updateAccountAuthListApi, backstageDelUserMember_V3 } from '@/pagesPersonal/service/patientManagement';` 2. **接口返回**:**必须**遵循 `7.8 接口封装调用规范`。业务层调用 Service 方法时,**必须**使用解构获取返回值(如 `let { resp, resData } = await api()`)。严禁只解构 `{ resp }` 或假设接口直接返回数据对象。 3. **参数解码**:`onLoad` 解析参数时,`JSON.parse` **必须**包裹在 `try-catch` 中,防止因字符截断导致的白屏。 4. **Dataset**:模板中保留 `data-xxx` 时,JS 中必须使用 `e.currentTarget?.dataset?.xxx` 安全访问,防止 `undefined` 报错。 5. **变量冲突**:接口方法名与本地变量冲突时,**必须**重命名本地变量(如 `acceptCredit` -> `targetStatus`)。 6. **样式单位**:严禁使用 `rpx`。**必须**全文批量替换为 `upx`。 7. **工具类替代**: * `publicFn.getMember` -> `await useGetMember()` * `util.getAuthorize` -> `common.getAuthorize` * `utils` 导入 -> `import { common } from '@/utils'` (Common) / `import icon from '@/utils/icon'` (Icon) * **Legacy Utils**: `getState.js` 和 `pagesPatientFn.js` 必须替换为 TS 版本: * 引用路径:`import { getState, pagesPatientFn } from '@/uni-app-base/utils'` * 物理文件:`uni-app-base/utils/getState.ts` 和 `uni-app-base/utils/pagesPatientFn.ts` * **注意**:`icon` 是一个静态资源路径,**必须**使用 `ref(icon)` 包裹,防止在模板中直接引用导致的路径错误。变量名为 `iconUrl`,`image` 标签上有相关的 `src` 都要用 `iconUrl` 进行获取。 21→ 22→8. **代码完整性**: * **严禁漏掉代码**:迁移时必须逐行核对小程序源码(js/wxml/wxss),确保所有逻辑、事件绑定、样式规则都已迁移。 * **平台差异处理**:如遇到无法直接迁移的逻辑(如 `xbossTrack`),严禁直接删除,必须在对应位置保留 TODO 注释并说明原因。 ## 1. 项目结构与配置 ### 配置文件 * **app.json** * 内容迁移至 `pages.json`。 * `pages` 数组保持不变,路径无需修改。 * `subpackages` 分包配置直接迁移到 `pages.json` 的 `subPackages` 字段。 * `window` 配置迁移至 `pages.json` 的 `globalStyle`。 * `tabBar` 配置迁移至 `pages.json` 的 `tabBar`。 * **入口文件** * `app.js` 的逻辑迁移至 `App.vue`。 * `globalData` 建议迁移至 `Vuex` 或 `Pinia` 状态管理,或者直接挂载到 `Vue.prototype` / `app.config.globalProperties`。 * `onLaunch`, `onShow`, `onHide` 生命周期对应迁移到 `App.vue`。 * 当前项目使用 `App.vue` + 自定义 `hook` 完成启动逻辑(如版本检查、应用状态判断、登录、配置拉取、WebSocket 链接等),迁移时请将原 `app.js` 流程拆分为 Hook 并在 `App.vue` 中顺序调用。 * 全局数据 `globalData`:当前项目依旧使用 `getApp().globalData` 存储运行期上下文数据(如 `accountInfo`、`hosId`、`channelId`、`hasWebsocket` 等),迁移时优先复用此约定;如需长期状态请同步到 store。 * **路由配置** * 若有生成新文件,需要在 `pages.json` 添加路由(`pages` 或 `subPackages`)以确保可访问。 * **路由检测**:执行转换时,需检测当前文件是否有路由。若该文件是非组件(不在 `components` 文件夹下)且没有路由,必须在 `pages.json` 中定义。 ## 2. 页面与组件文件转换 ### 文件后缀 * `.wxml` -> `.vue` (放在 `