uniapp开发遇到的十大坑
1. CSS 样式兼容性问题
问题:各平台对 CSS 的支持度与解析存在差异,导致同一样式在不同端表现不一致。常见于 flex 布局细节、position: fixed 定位失效、rpx 在 H5 端计算偏差等。
解决方案:
/* #ifdef MP-WEIXIN */
.container { padding: 20rpx; }
/* #endif */
/* #ifdef H5 */
.container { padding: 16px; }
/* #endif */
flex 等通用性强的方案,避免使用 bottom: 0 等容易失效的属性。uni.getSystemInfoSync() 动态计算部分样式值,替代完全依赖 CSS。2. 原生 API 的平台差异陷阱
问题:部分 uni.xxx API 在各端实现不一,如文件上传、扫码、地理位置等,需处理兼容逻辑。例如 uni.chooseImage 在 H5 端无法进行本地压缩。
解决方案:
#ifdef 判断平台,编写兼容代码:
chooseImage() {
// #ifdef H5
// H5 端需自行实现压缩逻辑
this.compressImage(file).then(upload)
// #endif
// #ifdef MP-WEIXIN
uni.chooseImage({ compressed: true, success: upload })
// #endif
}
3. 页面栈与路由限制
问题:小程序端页面栈深度通常限制为 10 层,uni.navigateTo 超过后将失效;H5 端虽无限制,但可能产生历史记录混乱。
解决方案:
function safeNavigateTo(url) {
const pages = getCurrentPages()
if (pages.length >= 9) {
uni.redirectTo({ url }) // 接近上限时替换当前页
} else {
uni.navigateTo({ url })
}
}
redirectTo 或 TabBar 页面重置栈深度。4. 长列表渲染性能瓶颈
问题:渲染大量列表数据时,小程序和 App 端容易卡顿,特别是包含复杂组件或图片时。
解决方案:
uv-list 等虚拟列表组件,只渲染可视区域项。<image lazy-load> 并设置合适 placeholder。5. 插件市场的“隐藏成本”
问题:插件质量参差不齐,可能存在兼容性缺陷、性能问题或停止维护的风险。
解决方案:
6. 单位与尺寸适配陷阱
问题:rpx 在 H5 端依赖根字体大小计算,若用户缩放浏览器或 CSS 重置了 html 的 font-size,布局会错乱。
解决方案:
postcss 插件将 rpx 直接转换为 rem 或 px,避免依赖根字体。px;需要自适应时,使用 rpx 并配合媒体查询做边界处理。7. 小程序分包与体积超限
问题:主包体积超过 2MB 将无法发布,且分包加载策略若不当,影响用户体验。
解决方案:
uni.getSubPackages 进行手动分包,将非首页资源和组件拆分子包。webpack 的 splitChunks 进一步优化公共代码抽取。src 引用而非打包进项目。8. 调试效率低下
问题:HBuilderX 的调试能力有限,尤其在小程序真机调试和性能分析时不便。
解决方案:
chrome://inspect 调试 App 的 WebView。process.env.NODE_ENV 控制日志输出,避免生产环境泄露信息。9. 跨端条件编译的滥用
问题:过度使用 #ifdef 导致代码可读性差,难以维护。
解决方案:
utils/
file.mpH5.js // H5 端实现
file.mpWeixin.js // 微信小程序端实现
file.js // 通用兜底实现
10. 发布与版本管理混乱
问题:多端需分别发布,易出现版本不同步,或某端审核失败导致整体延期。
解决方案:
夜雨聆风