# App 端问题排查记录 ## marked 包 Unicode 正则导致 App 白屏 **日期**: 2026-05-05 ### 问题现象 - App 端白屏,无法正常显示 - H5 和小程序正常,只有 App 有问题 - 控制台报错: ``` Invalid regular expression: /[\p{L}\p{N}]/: Invalid property name in character class ``` ### 根本原因 `marked` 包 v10+ 使用了 Unicode 属性转义正则表达式(如 `/\p{L}\p{N}/u`),App 基座的旧版 JS 引擎不支持。 ### 解决方案 降级 `marked` 到旧版本: ```bash npm install marked@4.3.0 --legacy-peer-deps ``` ### 预防措施 1. 第三方包升级前先在 App 基座测试 2. 避免使用太新的 npm 包(特别是涉及正则表达式的) 3. 定期测试 App 端构建 --- ## uni-app 运行环境版本和编译器版本不一致 **日期**: 2026-05-05 ### 问题现象 App 启动时提示: ``` 本应用使用HBuilderX4.84或对应的cli版本编译,而手机端SDK版本是5.07 ``` ### 根本原因 cli 项目的编译器版本与 HBuilderX 版本不同步,需要手动升级编译器。 ### 解决方案 ```bash npm install @dcloudio/uni-app@latest --legacy-peer-deps # 或指定版本 npm install @dcloudio/uni-app@3.0.0-alpha-5000720260416001 --legacy-peer-deps ``` 升级后验证: ```bash npm list @dcloudio/uni-app ``` ### 预防措施 1. 定期执行 `npm update @dcloudio/uni-app` 保持编译器最新 2. 升级 HBuilderX 后记得同步升级 cli 编译器 --- ## Android 手机网络请求无反应 **日期**: 2026-05-05 ### 问题现象 App 没有任何网络请求,接口没调用。 ### 根本原因 1. `config.ts` 中 `getPlatform()` 获取的平台名为首字母大写(如 `Android`),而配置对象用的是小写(`android`) 2. 导致 API 地址为 `undefined` ### 解决方案 修复 `config.ts` 中的平台判断: ```typescript function getPlatform(): 'web' | 'android' | 'ios' | 'h5' { // #ifdef APP-PLUS const systemInfo = uni.getSystemInfoSync(); const platform = (systemInfo.platform || '').toLowerCase(); if (platform === 'android') return 'android'; if (platform === 'ios') return 'ios'; return 'android'; // #endif return 'web'; } ``` ### 相关文件 - `my-uniapp-vue3/src/utils/config.ts` --- ## App 端 window/document/localStorage 兼容性问题 **日期**: 2026-05-05 ### 已修复的文件 1. **player/index.vue** - `window.location.href` 和 `window.location.origin` - 使用条件编译处理:`// #ifdef H5` / `// #ifndef H5` 2. **book-generator/index.vue** - `new URL()`, `window.location.hash`, `history.pushState` - 使用条件编译处理 3. **payment-confirm/index.vue** - `window.location.origin` - 使用条件编译处理 4. **NetworkStatus.vue** - `window.addEventListener` - App 端改用 `uni.onNetworkStatusChange` API 5. **request.ts** - `require()` 动态导入 - 改为 ES6 `import` 静态导入 ### 需要注意的 API(H5专用,App不支持) | API | H5 | App | 替代方案 | |-----|----|-----|---------| | `window.location` | ✅ | ❌ | 条件编译 | | `document.createElement` | ✅ | ❌ | 条件编译 | | `localStorage` | ✅ | ❌ | `uni.getStorageSync` | | `navigator.share` | ✅ | ❌ | `uni.share` | | `history.pushState` | ✅ | ❌ | 条件编译 | | `new URL()` | ✅ | ❌ | 条件编译 | ### 建议 所有使用 H5 特有 API 的地方,都应该使用条件编译: ```typescript // #ifdef H5 // H5 专用代码 // #endif // #ifndef H5 // App/小程序 专用代码 // #endif ``` --- ## JSON.stringify 循环引用导致 App 崩溃 **日期**: 2026-05-05 ### 问题现象 App 页面报错:`TypeError: Converting circular structure to JSON` ### 根本原因 `getCurrentPages()` 返回的页面对象包含循环引用(`$vm` 属性),不能直接用 `JSON.stringify()` 序列化。 ### 解决方案 避免对页面对象使用 JSON.stringify: ```typescript // 错误 ❌ const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; console.log(JSON.stringify(currentPage)); // 会崩溃! // 正确 ✅ const pages = getCurrentPages(); const currentPage = pages[pages.length - 1] as any; const id = currentPage?.options?.id; // 直接访问属性 ``` ### 已修复的文件 - `player/index.vue` - 移除 `JSON.stringify(currentPage)` --- ## CSS gap 属性在 App 端不兼容 **日期**: 2026-05-05 ### 问题现象 播放器页面在 App 上布局错乱,很多元素重叠或位置不对。 ### 根本原因 App 基座不支持 CSS `gap` 属性。 ### 解决方案 使用 `margin` 替代 `gap`: ```css /* 错误 ❌ */ .container { display: flex; gap: 16rpx; } /* 正确 ✅ */ .container { display: flex; } .container > view { margin-right: 16rpx; } ``` ### 已修复的文件 - `player/index.vue` - 所有 `gap` 改用 `margin` ### 预防措施 开发时使用 H5 测试,但发布前务必在 App 真机上测试布局。