uni-app 跨端小程序开发实践指南

Viewed 0

uni-app 跨端小程序开发实践

uni-app 是一个基于 Vue 技术栈的跨端开发框架,支持编译到微信、支付宝、字节跳动等多端小程序以及 H5 和 APP。它与 Vue 生态高度契合,上手快速,并且拥有丰富的模板和插件资源,非常适合业务型项目的快速落地。项目地址为 https://github.com/dcloudio/uni-app,文档位于 https://uniapp.dcloud.net.cn/,开发时还可以参考 awesome-wechat-weapp 等资源清单。

目标

  • 使用官方模板创建 uni-app 项目
  • 掌握 pages.json 路由、页面与组件的基础用法
  • 了解 uni.request 与条件编译
  • 把控工程化与包体策略

初始化与运行

使用 Vite 预设模板(Vue3)进行初始化:

# 使用 degit 拉取官方模板(或使用 HBuilderX 创建项目)
npx degit dcloudio/uni-preset-vue#vite my-uni-app
cd my-uni-app
npm i

运行到微信小程序:

# 开发模式(微信小程序)
npm run dev:mp-weixin

# 生产构建
npm run build:mp-weixin

构建产物位于 dist/dev/mp-weixindist/build/mp-weixin,用微信开发者工具“打开”该目录即可预览。

路由与页面(pages.json)

pages.json 文件用于声明页面与窗口配置,示例如下:

{
  "pages": [
    { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页" } },
    { "path": "pages/about/index", "style": { "navigationBarTitleText": "关于" } }
  ],
  "window": {
    "navigationBarBackgroundColor": "#ffffff",
    "navigationBarTextStyle": "black"
  }
}

页面单文件组件(SFC)示例(Vue3):

<!-- pages/index/index.vue -->
<template>
  <view class="page">
    <text>计数:{{ count }}</text>
    <button @click="count++">+1</button>
    <button @click="goAbout">关于</button>
  </view>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const count = ref(0)

function goAbout() {
  uni.navigateTo({ url: '/pages/about/index' })
}
</script>

<style>
.page { padding: 24rpx; }
</style>

网络请求与封装

基础网络请求调用方式:

uni.request({
  url: 'https://api.example.com/items',
  method: 'GET',
  success: (res) => {
    // 建议统一判断后端业务字段
    console.log(res.data)
  },
  fail: () => {
    uni.showToast({ title: '网络错误', icon: 'none' })
  }
})

为了更好的代码组织和复用,可以进行统一封装,例如:

// src/services/http.ts
export function request<T>(url: string, options: UniApp.RequestOptions = {}) {
  const token = uni.getStorageSync('token')
  return new Promise<T>((resolve, reject) => {
    uni.request({
      url: 'https://api.example.com' + url,
      timeout: 10000,
      header: { 'Content-Type': 'application/json', Authorization: token ? `Bearer ${token}` : '' },
      ...options,
      success: (res) => {
        const data: any = res.data
        if (data && data.code === 0) resolve(data.data as T)
        else reject({ code: data?.code ?? -1, message: data?.message ?? '业务错误', raw: data })
      },
      fail: (err) => reject({ code: 0, message: '网络异常', raw: err })
    })
  })
}

条件编译与跨端差异

uni-app 支持条件编译指令,便于处理多端差异:

// #ifdef MP-WEIXIN
console.log('仅在微信小程序端执行')
// #endif

// #ifdef H5
console.log('仅在 H5 端执行')
// #endif

常见跨端差异包括能力差异(如文件系统、Canvas)和组件差异。建议优先使用官方或生态中跨端兼容的组件,必要时使用条件编译或封装适配层。

工程化与包体

  • easycom 自动组件:遵循命名和目录约定可以免注册组件;第三方组件建议放入 uni_modules 以便管理。
  • 分包:利用 pages.jsonsubPackages 拆分业务,降低主包体积。
  • 资源治理:进行图片压缩、接口域名配置、CDN 缓存等优化。
  • 错误治理与埋点:统一封装 toast、dialog 和日志,上报关键错误。

分包配置示例片段:

{
  "subPackages": [
    {
      "root": "pages-sub/user",
      "pages": [{ "path": "profile/index", "style": { "navigationBarTitleText": "我的" } }]
    }
  ]
}

常见问题

  • 微信开发者工具 npm 构建:如果引入第三方 npm 包,需在工具中开启“使用 npm 模块”并执行“构建 npm”。
  • 组件不生效:检查 easycom 命名与路径;或在页面 components 中显式注册(旧方案)。
  • pages.json 修改不生效:需重启编译或开发工具;确保路径正确且文件已保存。
  • 条件编译未按预期:确认注释语法与构建目标平台一致。

适用场景

  • 以 Vue 技术栈为主的前端团队
  • 快速构建业务型小程序与 H5
  • 多端覆盖但更偏向小程序与移动端

参考

总结

uni-app 在“上手速度”、“生态整合”与“跨端覆盖”方面表现优秀。合理使用条件编译、分包与统一数据层,可以在多端间保持一致的开发体验与交付质量。

0 Answers