一、前言:为什么你的 uni-app 总是 “能用但不好用”?

跨端开发早已不是选择题,而是标配。

uni-app 凭借 一套代码发布到 App / 小程序 / H5 / 鸿蒙 的超强能力,成为中小团队与企业级项目的首选框架。但真实项目里,我们经常遇到:

  • 主包体积过大、小程序无法发布
  • 首屏慢、白屏长、列表卡顿
  • 多端样式错乱、API 不兼容
  • 代码混乱、难以维护、新人接手成本高

这篇文章不讲空话,只讲 可落地、可度量、可上线 的最佳实践。读完你能直接搭建出:启动更快、体积更小、多端更稳的高水准 uni-app 项目。


二、核心认知:uni-app 到底是什么?(面试必问)

2.1 一句话总结

编译型跨端框架:基于 Vue,编译时抹平差异,运行时原生渲染。

2.2 你必须知道的 3 个关键点

  • 小程序:双线程模型,逻辑层 / 视图层分离
  • App:原生渲染(Skyline/Weex),性能远超 WebView
  • H5:SPA 单页应用,路由统一管理

结论:uni-app 不是套壳 Web,它是真正具备原生级体验的跨端方案。


三、工程化搭建:从 0 到 1 构建企业级目录

3.1 推荐目录结构(直接复制)

plaintext

├── pages           页面
├── components      公共组件
├── uni_modules     插件依赖
├── static          静态资源(图片/字体)
├── utils           工具(请求/加密/校验)
├── store           全局状态
├── config          环境配置
├── App.vue         入口
├── pages.json      路由配置
└── manifest.json    平台配置

3.2 请求封装(全网最稳版本)

javascript

运行

// utils/request.js
const baseURL = config.baseURL

const request = (options) => {
  return new Promise((resolve, reject) => {
    uni.showNavigationBarLoading()
    
    uni.request({
      url: baseURL + options.url,
      method: options.method || 'GET',
      data: options.data,
      header: {
        token: uni.getStorageSync('token') || ''
      },
      success: (res) => {
        if (res.statusCode === 200) {
          resolve(res.data)
        } else {
          reject(res)
        }
      },
      fail: reject,
      complete: () => {
        uni.hideNavigationBarLoading()
      }
    })
  })
}

export default request

3.3 环境区分(dev /test/prod)

通过 process.env.NODE_ENV 自动切换:

  • 开发:打印日志、测试接口
  • 生产:关闭 log、启用监控、正式接口

四、编码规范:多端兼容的核心技巧

4.1 条件编译(灵魂写法)

vue

<!-- #ifdef H5 -->
<web-view :src="url"></web-view>
<!-- #endif -->

<!-- #ifdef MP-WEIXIN -->
<view>微信专属</view>
<!-- #endif -->

// #ifdef APP-PLUS
plus.navigator.setStatusBarStyle('dark')
// #endif

4.2 样式规范

  • 统一使用 rpx
  • 不写死 px
  • 自定义导航栏必须兼容状态栏
  • 尽量使用 class,避免行内样式

五、性能极致优化:从 2.8s → 1.1s 提速实战

5.1 启动优化(最影响体验)

  • 分包加载:主包只保留首页 / 登录
  • 图片压缩:使用 webp、缩略图
  • 首屏精简:非必要请求延后
  • 骨架屏:降低感知延迟

json

// pages.json 分包配置
"subPackages": [
  {
    "root": "pages/user",
    "pages": [{ "path": "info" }]
  }
]

5.2 渲染优化

  • 长列表必须用 recycle-list 虚拟列表
  • 避免一次性渲染大量节点
  • 减少组件嵌套(不超过 5 层)
  • 图片懒加载

5.3 JS 运行优化

  • 避免 onPageScroll 频繁赋值
  • 定时器 / 监听必须在 onUnload 销毁
  • 大数据优先使用 Map / Set

5.4 内存优化

  • 不使用 base64 大图
  • 及时清理缓存
  • 避免频繁创建销毁组件

六、多端适配:一次编写,处处稳定

6.1 最常见的平台差异

  • 导航栏:优先原生,自定义需处理状态栏
  • 分享:各平台条件编译
  • 支付:微信 / 支付宝 / App 分开封装
  • 弹窗:统一使用 uni.showModal

6.2 小程序专项优化

  • 开启按需注入
  • 启用 lazyCodeLoading
  • 配置分包预下载

七、线上监控与问题排查

7.1 必须监控的指标

  • JS 错误
  • 请求异常
  • 页面崩溃
  • 启动时间 / 首屏时间

7.2 调试工具

  • HBuilderX 真机调试
  • Chrome 调试 App
  • 微信开发者工具
  • 日志实时查看

八、企业级最佳实践(避坑指南)

  1. 页面栈不要超过 10 层,否则小程序闪退
  2. 大图必压缩,否则内存暴涨
  3. 少用自定义组件嵌套,渲染性能下降
  4. 优先官方 API,再用插件,最后原生扩展
  5. 热更 + 整包更新搭配使用

九、总结:高质量 uni-app 项目的 4 个核心

  1. 工程化先行:规范目录、统一请求、环境分离
  2. 性能优先:启动、渲染、内存三管齐下
  3. 多端兼容:合理使用条件编译
  4. 可监控可迭代:线上问题可追踪

按照这套标准开发,你的项目能轻松达到:

  • 启动时间:iOS < 1.2s / Android < 1.5s
  • 首屏渲染:< 500ms
  • 主包体积:减少 40%+
  • 多端一致性:99%
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐