Chapter 01

uni-app 生态全景

理解 uni-app 与 uni-app x 的本质差异,掌握 UTS 语言基础,搭建完整的跨端开发环境

1.1 什么是 uni-app?

uni-app 是由 DCloud(数字天堂)公司开发的一个使用 Vue.js 开发多端应用的前端框架。它的核心理念是"一次开发,多端发布"——开发者编写一份代码,经过编译工具链处理,可以同时运行在以下平台:

2025 年现状

截至 2025 年,uni-app 官方统计有超过 400 万开发者,已发布的跨端应用超过 200 万款,是国内最主流的跨端开发框架之一。其生态成熟度、中文文档质量和社区活跃度都远超同类方案。

为什么选择 uni-app 而不是 React Native 或 Flutter?

这是初学者最常问的问题。三个框架有各自的定位:

React Native
Facebook 推出,使用 React + JavaScript,通过 Bridge(旧架构)或 JSI + Fabric(新架构)与原生交互。生态丰富,但需要熟悉 React 体系,且配置复杂,中文资料较少。
Flutter
Google 推出,使用 Dart 语言,自绘 UI(Skia/Impeller 引擎),性能优秀,但 Dart 语言学习成本较高,且小程序支持非常有限(目前仍是实验性)。
uni-app / uni-app x
DCloud 推出,使用 Vue.js 语法,原生支持微信小程序生态,中文社区最活跃,对已有 Vue 开发者非常友好。uni-app x 的 UTS 语言则进一步接近原生性能。

1.2 uni-app x:下一代跨端方案

uni-app x 是 DCloud 于 2023 年推出的全新跨端方案,与传统 uni-app 有根本性的架构差异。理解这种差异是掌握整个生态的关键。

传统 uni-app 的架构局限

传统 uni-app 在 App 端(非 H5、非小程序)采用的是双线程 WebView 渲染架构:

这种架构的问题是:复杂动画、长列表、高频交互时,跨线程通信延迟会导致明显的卡顿感,和真正的原生 App 有差距。

uni-app x 的突破:原生渲染 + UTS 语言

uni-app x 彻底抛弃了 WebView,采用原生渲染引擎

传统 uni-app(App 端)

  • WebView 渲染
  • JavaScript 逻辑层
  • 跨线程 JSON 通信
  • 性能受 WebView 限制
  • 支持 Vue 2 / Vue 3

uni-app x(App 端)

  • 原生组件渲染(Android View / iOS UIView)
  • UTS 语言编译为原生代码
  • 无跨线程通信瓶颈
  • 性能接近原生 App
  • 使用 uvue 文件(类 Vue 语法)
何时选择 uni-app x?

如果你的应用对性能要求较高(如复杂动画、实时交互、大量数据渲染),并且主要目标平台是 Android/iOS App,应优先选择 uni-app x。如果主要目标是微信小程序 + H5,传统 uni-app(Vue 3 + Vite)完全足够。

1.3 UTS 语言详解

UTS(Uni Type Script)是 DCloud 为 uni-app x 设计的一门强类型脚本语言。从语法层面看,它与 TypeScript 高度兼容,但有根本性的不同:

UTS 不是运行时脚本,而是编译型语言

TypeScript 最终会编译为 JavaScript 在 JS 引擎中运行。UTS 则不同:

编译到 Android(Kotlin)
UTS 代码被编译器转换为 Kotlin 代码,由 Android ART 虚拟机原生执行,性能与手写 Kotlin 相当。
编译到 iOS(Swift)
UTS 代码被编译器转换为 Swift 代码,由 iOS 系统原生执行,性能与手写 Swift 相当。
编译到 Web(JavaScript)
UTS 代码被编译为 JavaScript,在浏览器中运行,此时行为与 TypeScript 类似。
编译到小程序
UTS 代码被编译为各小程序平台的 JS 代码。

这意味着:你写的同一份 UTS 代码,在 Android 上跑的是真正的 Kotlin 字节码,在 iOS 上跑的是真正的 Swift 代码,没有任何 JavaScript 桥接开销。

UTS 语法示例

// UTS 代码示例 — 语法与 TypeScript 高度相似
// 但会被编译为各平台原生代码

import { Vibrator, VibrateShort } from 'android.os'  // 直接导入 Android 原生类

export function vibrateDevice() : void {
  // 调用 Android 原生震动 API
  const vibrator = UTSAndroid.getSystemService('vibrator') as Vibrator
  vibrator.vibrate(VibrateShort({
    duration: 100
  }))
}

// 定义类型,与 TypeScript 完全一致
interface UserInfo {
  id: number
  name: string
  avatar?: string
}

function greet(user: UserInfo): string {
  return `你好,${user.name}!`
}
UTS 的限制

UTS 虽然与 TypeScript 语法接近,但不能直接使用 npm 包(因为 npm 包假设运行在 JS 引擎上)。如果需要使用第三方库,需要查找支持 UTS 的版本,或者将其封装为 UTS 插件。

1.4 跨端渲染原理

理解 uni-app 如何实现"一套代码,多端运行",需要了解它的编译器工作机制。

编译器的核心工作

uni-app 的编译器(基于 Vite + 自定义插件)将你的 .vue / .uvue 文件处理为各平台所需的格式:

源文件目标平台编译产物
.vueH5标准 HTML/CSS/JS(Vue 3 运行时)
.vue微信小程序.wxml + .wxss + .js + .json
.uvueAndroidKotlin 代码 + 原生 XML 布局(或动态布局)
.uvueiOSSwift 代码 + 原生 UIKit 布局

条件编译:精确控制平台差异

当某些逻辑只应在特定平台执行时,uni-app 提供了条件编译语法,通过注释形式嵌入到代码中:

// #ifdef MP-WEIXIN
// 以下代码仅编译到微信小程序
wx.login({ success: (res) => console.log(res.code) })
// #endif

// #ifdef APP
// 以下代码仅编译到 App(Android + iOS)
import { NativeModule } from './native.uts'
NativeModule.requestPermission()
// #endif

// #ifndef H5
// 以下代码编译到除 H5 之外的所有平台
uni.showToast({ title: '非 H5 平台' })
// #endif

1.5 环境搭建

uni-app 的官方 IDE 是 HBuilderX,它是开发 uni-app 的最佳工具,内置了编译器、模拟器集成、调试工具等。

HBuilderX 安装

  1. 访问 https://www.dcloud.io/hbuilderx.html,下载正式版(Alpha 版功能最新但可能有 Bug)
  2. macOS 解压后拖入 Applications,Windows 直接运行安装程序
  3. 首次启动需要登录 DCloud 账号(免费注册)

创建第一个项目

# 方式一:HBuilderX 图形界面
# 文件 → 新建 → 项目 → uni-app
# 选择模板:默认模板(Vue3 + Vite)

# 方式二:命令行(仅传统 uni-app,不含 uni-app x)
npx degit dcloudio/uni-preset-vue#vite-ts my-app
cd my-app
npm install

# 运行到 H5(开发模式)
npm run dev:h5

# 运行到微信小程序(需在 project.config.json 配置 appid)
npm run dev:mp-weixin

必装的辅助工具

微信开发者工具
调试微信小程序必备,下载地址:developers.weixin.qq.com/miniprogram/dev/devtools/download.html
Android Studio
如需真机调试 Android App 或使用 Android 模拟器,需安装 Android Studio 并配置 SDK。
Xcode(macOS)
iOS App 打包和真机调试需要 Xcode,仅限 macOS 系统。
Node.js 18+
命令行创建项目时需要,推荐使用 nvm 管理多版本。
推荐的初学路径

建议先从 H5 模式入手开发和调试,因为 H5 无需安装任何额外工具,浏览器即可预览。掌握基础后再逐步扩展到小程序和 App 端调试。

1.6 项目目录速览

用 HBuilderX 创建的默认 uni-app 项目(Vue 3 + Vite 模板)结构如下:

my-uniapp/
├── src/
│   ├── pages/
│   │   └── index/
│   │       └── index.vue     # 首页
│   ├── static/               # 静态资源(图片、字体)
│   ├── uni_modules/          # uni-app 插件市场的组件
│   ├── App.vue               # 应用根组件,全局生命周期
│   ├── main.ts               # 入口文件,创建 Vue 实例
│   ├── manifest.json         # App 配置(appid、权限、图标)
│   └── pages.json            # 路由注册、导航栏、tabBar 配置
├── index.html                # H5 模板
├── vite.config.ts            # Vite 配置
└── package.json

uni-app x 的项目结构类似,但页面文件使用 .uvue 扩展名,UTS 逻辑文件使用 .uts 扩展名。

1.7 生命周期体系

uni-app 有三个层级的生命周期,理解它们的执行顺序至关重要:

应用生命周期(App.vue)

// App.vue
export default {
  onLaunch(options) {
    // 应用初次启动时触发(只触发一次)
    console.log('App 启动,参数:', options)
  },
  onShow(options) {
    // 应用进入前台时触发
  },
  onHide() {
    // 应用进入后台时触发
  }
}

页面生命周期

// 页面 .vue 文件
import { onLoad, onShow, onHide, onUnload, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'

onLoad((query) => {
  // 页面加载,可获取路由参数 query
  console.log('页面参数:', query)
})

onShow(() => {
  // 页面每次显示时触发(包括从其他页面返回)
})

onReachBottom(() => {
  // 页面触底,适合加载更多数据
})

onPullDownRefresh(() => {
  // 下拉刷新(需在 pages.json 中启用 enablePullDownRefresh)
  // 完成后调用:
  uni.stopPullDownRefresh()
})
Composition API 生命周期

uni-app 的页面生命周期钩子(onLoad、onShow 等)与 Vue 3 的 Composition API 生命周期(onMounted、onUnmounted 等)都可以使用,但它们是独立的体系。onMounted 对应的是 Vue 组件挂载完成,onLoad 对应的是页面加载(会携带路由参数)。实际开发中通常两者配合使用。

1.8 小结

本章我们建立了对 uni-app 生态的全局认知:

下一章我们将深入项目结构与配置文件,理解 pages.jsonmanifest.json 的完整配置体系。