什么是 UniApp?
UniApp 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。
跨平台兼容
一套代码,多端运行,真正实现跨平台开发
Vue.js 生态
基于 Vue.js,学习成本低,生态丰富
高性能
接近原生应用的性能和体验
UniApp 技术架构
核心框架层
基于 Vue.js 的运行时和编译器,提供组件系统、响应式数据绑定、生命周期等核心功能。
桥接层
将 Vue 组件和 API 调用转换为各平台原生代码,实现跨平台兼容。
平台层
对接各平台原生能力,包括小程序、App、H5等不同运行环境。
UniApp 核心特性
一次开发,多端发布
UniApp 使用 Vue.js 语法,开发者只需编写一套代码,即可编译到 iOS、Android、H5、以及各种小程序平台。
// 示例代码
export default {
data() {
return {
title: 'Hello UniApp'
}
},
onLoad() {
console.log('页面加载')
},
methods: {
handleClick() {
uni.showToast({
title: '点击事件'
})
}
}
}
高性能体验
UniApp 通过优化渲染机制和原生组件调用,提供接近原生应用的性能和用户体验。
丰富的组件库
内置大量跨平台 UI 组件,包括基础组件、表单组件、导航组件等,开箱即用。
强大的插件生态
支持丰富的插件市场,包括 UI 库、图表、地图、支付等常用功能模块。
完善的开发工具
提供 HBuilderX IDE,支持代码提示、真机调试、云打包等一站式开发体验。
UniApp 开发流程
环境搭建
安装 HBuilderX IDE 和必要的开发工具链
# 安装 CLI 工具 (可选,HBuilderX自带)
npm install -g @vue/cli @dcloudio/uni-cli
# 创建项目 (推荐使用HBuilderX可视化创建)
# 或 vue create -p dcloudio/uni-preset-vue my-project
项目开发
使用 Vue 语法编写页面和组件,调用 UniApp API
调试测试
使用模拟器或真机进行多端调试
打包发布
一键打包到各平台,生成可发布的安装包
# (通常在 HBuilderX 中点击菜单操作)
# 或使用 CLI:
# 打包H5
npm run build:h5
# 打包微信小程序
npm run build:mp-weixin
# 打包App
npm run build:app
多端适配指南
条件编译
UniApp 提供条件编译语法,可以针对不同平台编写特定代码,解决平台差异问题。
// #ifdef H5
console.log('这段代码只会在H5平台编译')
// #endif
// #ifdef MP-WEIXIN
console.log('这段代码只会在微信小程序平台编译')
// #endif
// #ifndef APP-PLUS (非App平台)
console.log('这段代码不会在App平台编译')
// #endif
平台差异处理
CSS 差异
各平台对 CSS 的支持程度不同,需使用条件编译或统一单位(如 rpx)。避免使用平台特有选择器。
API 差异
优先使用 `uni.API`,它们已做跨端封装。若必须用平台特有API,使用条件编译包裹。
组件差异
部分原生组件(如map, video)在各端实现不同,查阅文档了解其属性和事件差异。
最佳实践
抽象通用组件
将业务逻辑和UI封装成可复用的组件,减少平台特定代码。
使用 Flex 布局
Flexbox 在各端支持良好,是实现响应式布局的首选。
充分测试
在所有目标平台上进行全面测试,特别是交互和边界情况。
在线代码体验
UniApp 示例代码
运行结果 (模拟器)
点击"运行"按钮启动模拟器
学习资源
常见问题
UniApp 和原生开发相比有什么优势?
UniApp 的性能如何?
如何解决不同平台的兼容性问题?
1. **条件编译:** 使用 `#ifdef`, `#ifndef`, `#endif` 等指令,在编译时包含或排除特定平台的代码块(JS, CSS, HTML)。
2. **平台特定文件:** 如 `xxx.mp-weixin.css`, `xxx.app.vue` 等,会自动被对应平台选用。
3. **`uni.getSystemInfoSync().platform`:** 在运行时判断当前平台,执行不同逻辑。
4. **优先使用`uni.*`API:** 这些API已经过跨端封装。
建议开发时先实现核心功能的跨平台版本,再针对特定平台差异进行适配。