一. 邂逅跨平台开发
1. 邂逅跨平台开发

- 传统移动端开发方式
- 自从
iOS和Android系统诞生以来,移动端开发主要由iOS和Android这两大平台占据 - 早期的移动端开发人员主要是针对
iOS和Android这两个平台分别进行同步开发 - 原生开发模式优缺点:
- 原生
App在体验、性能、兼容性都非常好,并可以非常方便的使用硬件设备,比如:摄像头、罗盘等 - 但是同时开发两个平台,无论是成本上,还是时间,对于企业来说这个花费都是巨大,不可接受的
- 纯原生 开发效率 和 上线周期 也严重影响了应用快速的迭代,也不利于多个平台版本控制等
- 原生
- 自从
- 跨平台开发的诞生
- 因为原生
App存在:时间长、成本高、迭代慢、部署慢、不利于推广等因素 - 导致了跨平台开发的概念渐渐走进了人们的视野
- 因此 “一套代码,多端运行” 的跨平台理念也应运而生
- 因为原生
2. 原生 VS 跨平台
- 原生开发的特点:
- 性能稳定,使用流畅,用户体验好、功能齐全,安全性有保证,兼容性好,可使用手机所有硬件功能等
- 但是开发周期长、维护成本高、迭代慢、部署慢、新版本必须重新下载应用
- 不支持跨平台,必须同时开发多端代码
- 跨平台开发的特点:
- 可以跨平台,一套代码搞定
iOS、Android、微信小程序、H5应用等 - 开发成本较低,开发周期比原生短
- 适用于跟系统交互少、页面不太复杂的场景
- 但是对开发者要求高,除了本身
js的了解,还必须熟悉一点原生开发 - 不适合做高性能、复杂用户体验,以及定制高的应用程序。比如:抖音、微信、QQ等
- 同时开发多端兼容和适配比较麻烦、调试起来不方便
- 可以跨平台,一套代码搞定
3. 跨平台发展史
- 跨平台发展史
- 2009年以前,当时最要是使用最原始的
HTML+CSS+JS进行移动端App开发 - 2009-2014年间, 出现了
PhoneGap、Cordova等跨平台框架,以及Ionic轻量级的手机端UI库 - 2015年,
ReactNative(跨平台框架)掀起了国内跨平台开发热潮,一些互联网大厂纷纷投入ReactNative开发阵营 - 2016年,阿里开源了
Weex,它是一个可以使用现代化Web技术开发高性能原生应用的框架 - 2017年
Google I/O大会上,Google正式向外界公布了Flutter,一款跨平台开发工具包,用于为Android、iOS、Web、Windows、Mac等平台开发应用 - 2017年至今,微信小程序、
uni-app、Taro等一系列跨平台小程序框架陆续流行起来了
- 2009年以前,当时最要是使用最原始的
- 应该如何选择?个人建议
- 需要做高性能、复杂用户体验、定制高的
APP、需硬件支持的选原生开发 - 需要性能较好、体验好、跨
Android、iOS平台、H5平台、也需要硬件支持的选Flutter(采用Dart开发) - 需要跨小程序、
H5平台、Android、iOS平台、不太复杂的先选uni-app,其次选Taro - 不需要跨平台的,选择对应技术框架即可
- 需要做高性能、复杂用户体验、定制高的
4. 跨平台框架对比
| 类型 | Cordova | Xamarin | React Native | Weex | Uniapp | Flutter |
|---|---|---|---|---|---|---|
| 性能 | 低 | 高 | 较高 | 中 | 高 | 高 |
| 上手难度 | 容易 | 较高 | 较高 | 容易 | 容易 | 中 |
| 核心 | js | .NET | React | Weex | vue | Dart |
| 框架轻重 | 轻 | 较重 | 较重 | 较轻 | 轻 | 重 |
| 特点 | 适合单页面 | 适合整体 App | 适合整体App | 适合单页面 | 适合整体App | 适合整体 App |
| 社区 | 活跃度较低 | 活跃度低 | 活跃度高,Facebook维护 | 活跃度中,目前托管apache | 活跃度高,Dcloud维护 | 活跃度高,Google维护 |
| 支持平台 | Android、ios、Windows、MacOS | Android、ios、Windows | Android、ios、Web | Android、ios、Web | Android、ios、Web、小程序、快应用 | Android、ios、Web、MacOS、Linux、Windows、Fuchsia |
| 适应性 | Web 开发学习成本低 | .NET、C# 工程师开发 | Web 开发学习成本低 | Web 开发学习成本低 | Web 开发学习成本低 | Java、C++、C#、开发学习成本低 |
5. 跨平台项目实战

6. 认识 uni-app
- 官网对
uni-app的介绍:uni-app是一个使用Vue.js开发前端应用的框架- 即开发者编写一套代码,便可发布到
iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台 uni-app在手,做啥都不愁。即使不跨端,uni-app也是更好的小程序开发框架、更好的App跨平台框架、更方便的H5开发框架。不管领导安排什么样的项目,你都可以快速交付,不需要转换开发思维、不需要更改开发习惯
uni-app的历史uni-app中的uni,读you ni,是统一的意思DCloud于2012年开始研发的小程序技术,并推出了HBuilderX开发工具- 2015年,
DCloud正式商用了自己的小程序,产品名为“流应用”,- 并捐献给了工信部旗下的
HTML5中国产业联盟
- 并捐献给了工信部旗下的
- 该应用能接近原生功能和性能的
App,并且即点即用,不需要安装 - 微信团队经过分析,于2016年初决定上线微信小程序业务,但其没有接入中国产业联盟标准,而是订制了自己的标准
7. uni-app VS 微信小程序
uni-app和微信小程序相同点:- 都是接近原生的体验、打开即用、不需要安装
- 都可开发微信小程序、都有非常完善的官方文档
uni-app和微信小程序区别:uni-app支持跨平台,编写一套代码,可以发布到多个平台,而微信小程序不支持uni-app纯Vue体验、高效、统一、工程化强,微信小程序工程化弱、使用小程序开发语言- 微信小程序适合较复杂、定制性较高、兼容和稳定性更好的应用
uni-app适合不太复杂的应用,因为需要兼容多端,多端一起兼容和适配增加了开发者心智负担
uni-app和 微信小程序,应该如何选择?- 需要跨平台、不太复杂的应用选
uni-app,复杂的应用使用uni-app反而增加了难度 - 不需要跨平台、较复杂、对兼容和稳定性要求高的选原生微信小程序
- 需要跨平台、不太复杂的应用选
8. uni-app 架构图

二. 初体验 uni-app
1. uni-app 初体验
创建
uni-app项目- 支持 可视化界面 和
Vue-CLI两种方式。可视化方式比较简单,HBuilderX内置相关环境,开箱即用
- 支持 可视化界面 和
开发工具
HBuilderX:HbuilderX是通用的前端开发工具,但为uni-app做了特别强化- 安装完之后可以注册一个
Dcloud的开发者账号(左下角可以点击注册)
注意:
- 用
Vue3的Composition API建议用HBuilderX最新Alpha版,旧版有兼容问题
方式一(推荐):
HBuilderX创建uni-app项目- 点工具栏里的文件 => 新建 => 项目(快捷键
Ctrl + N) - 选择
uni-app类型,输入工程名,选择模板,选择Vue版本,点击创建即可
- 点工具栏里的文件 => 新建 => 项目(快捷键
方式二:
Vue-CLI命令行创建全局安装
Vue-CLI(目前仍推荐使用vue-cli 4.x)shellnpm i -g @vue/cli@4创建项目
shellvue create -p dcloudio/uni-preset-vue my-project-name
2. HBuilderX 开发工具特点
HBuilderX从v3.2.5开始优化了对vue3的支持- 完善的提示,在代码助手右侧还能看到清晰的帮助描述
- 支持
css中使用v-bind提示和参数变量提示及转到定义(Alt + click) Vue3推荐使用的setup语法糖支持也完全支持- 在
data、props和setup中定义的变量以及methods和setup内定义的函数都能在template中提示和转到定义(Alt + click)
HBuilderX支持各种表达式语法,如less、scss、stylus、ts等高亮,无需安装插件this的精准识别和语法提示- 组件的标签、属性都可以直接被提示出来
- 不管是关闭
HBuilder,还是断电、崩溃,临时文件始终会自动保存 - 更多功能:https://hx.dcloud.net.cn/Tutorial/Language/vue
3. 运行 uni-app
在浏览器运行
- 选中
uniapp项目,点击工具栏的运行 => 运行到浏览器 => 选择浏览器,即可体验uni-app的web版
- 选中
在微信开发者工具运行
选中
uniapp项目,点击工具栏的运行 => 运行到小程序模拟器 => 微信开发者工具,即可在微信开发者工具里面体验uni-app其它注意事项:
微信开发者工具需要开启服务端口:小程序开发工具设置 => 安全(目的是让
HBuilder可以启动微信开发者工具)如第一次使用,需配置微信开发者工具的安装路径(会提示下图)
- 点击工具栏运行 => 运行到小程序模拟器 => 运行设置,配置相应小程序开发者工具的安装路径

自动启动失败,可用微信开发者工具手动打开项目(项目在
unpackage/dist/dev/mp-weixin路径下)
在运行
App到手机或模拟器(需要先安装模拟器)- 先连接真机 或 模拟器(
Android的还需要配置adb调试桥命令行工具) - 选中
uniapp项目,点击工具栏的运行 => 运行App到手机或模拟器,即可在该设备里面体验uni-app(支持中文路径)
- 先连接真机 或 模拟器(
4. 安装 mumu 模拟器
第一步:下载
mumu模拟器:https://mumu.163.com/mac/index.html第二步:安装
mumu模拟器第三步:配置
adb调试桥命令行工具(用于HBuilderX和Android模拟器建立连接,来实时调试和热重载。HBuilderX是有内置adb的 )HBuilderX正式版的adb目录位置:安装路径下的tools/adbs目录- 而
mac下为HBuilderX.app/Contents/tools/adbs目录
- 而
HBuilderX Alpha版的adb目录位置:安装路径下的plugins/launcher/tools/adbs目录( 需先运行后安装了插件才会有该目录 )- 而
mac下为/Applications/HBuilderX-Alpha.app/Contents/HBuilderX/plugins/launcher/tools/adbs目录
- 而
- 在
adbs目录下运行./adb,即可使用adb命令(Win和Mac一样) - 如想要全局使用
adb命令,window电脑可在:设置 => 高级设计 => 环境变量中设置,详情见ppt
第四步:
HBuilderX开发工具连接mumu模拟器,使用adb调试桥来连接bashadb connect 127.0.0.1:7555 #端口是固定的,启动mumu模拟器默认是运行在7555端口第五步:选中项目 => 运行 => 运行
App到手机或模拟器 => 选中Android基座(基座其实是一个app壳)
5. 安装其它模拟器
Mac电脑:- 可以安装
Xcode或者Android Studio软件(推荐XCode)
- 可以安装
Window电脑:- 安装
mumu、夜神、雷电模拟器等(推荐) - 可以安装
Android Studio软件(模拟器大、速度慢、卡)
- 安装
详细安装教程
- 可以看资料中对应的安装文档

6. 目录结构
- 一个
uni-app工程,默认包含如下目录及文件:
┌─uniCloud 云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb(详见uniCloud)
│─components 符合vue组件规范的uni-app组件目录
│ └─comp-a.vue 可复用的a组件
├─utssdk 存放uts文件
├─pages 业务页面文件存放的目录
│ ├─index
│ │ └─index.vue index页面
│ └─list
│ └─list.vue list页面
├─static 存放应用引用的本地静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此
├─uni_modules 存放[uni_module](/uni_modules)。
├─platforms 存放各平台专用页面的目录
├─nativeplugins App原生语言插件
├─nativeResources App端原生资源目录
│ └─android Android原生资源目录
├─hybrid App端存放本地html文件的目录
├─wxcomponents 存放小程序组件的目录
├─unpackage 非工程代码,一般存放运行或发行的编译结果
├─AndroidManifest.xml Android原生应用清单文件
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期
├─manifest.json 配置应用名称、appid、logo、版本等打包信息
├─pages.json 配置页面路由、导航条、选项卡等页面类信息
└─uni.scss 这里是uni-app内置的常用样式变量7. 开发规范
- 为了实现多端兼容,综合考虑编译速度、运行性能等因素,
uni-app约定了如下开发规范:- 页面文件遵循
Vue单文件组件 (SFC) 规范 - 组件标签靠近小程序规范,详见
uni-app组件规范 - 接口能力(
JS API)靠近微信小程序规范,但需将前缀wx替换为uni,详见uni-app接口规范 - 数据绑定及事件处理同
Vue.js规范,同时补充了App及页面的生命周期 - 为兼容多端运行,建议使用
flex布局进行开发,推荐使用rpx单位(750设计稿) - 文档直接查看
uni-app的官网文档: https://uniapp.dcloud.net.cn/
- 页面文件遵循
三. uni-app 全局文件
1. main.js
main.js是uni-app的入口文件,主要作用是:- 初始化
vue实例 - 定义全局组件
- 定义全局属性
- 安装插件,如:
pinia、vuex等

- 初始化
2. App.vue
App.vue入口组件App.vue是uni-app的入口组件,所有页面都是在App.vue下进行切换App.vue本身不是页面,这里不能编写视图元素,也就是没有<template>元素
App.vue的作用:- 应用的生命周期
- 编写全局样式
- 定义全局数据
globalData
注意:
- 应用的生命周期仅可在
App.vue中监听,在页面中监听无效

3. 全局和局部样式
- 全局样式
App.vue中style的样式为全局样式,作用于每一个页面style标签不支持scoped,写了导致样式无效App.vue中通过@import语句可以导入外联样式,一样作用于每一个页面
uni.scss文件也是用来编写全局公共样式,通常用来定义全局变量uni.scss中通过@import语句可以导入外联样式,一样作用于每一个页面
- 局部样式
- 在
pages目录下的vue文件的style中的样式为局部样式,只作用对应的页面,并会覆盖App.vue中相同的选择器 vue文件中的style标签也可支持scss等预处理器,比如:安装dart-sass插件后,style标签便可支持scss写样式style标签支持scoped吗?不支持,不需写
- 在
4. uni.scss
uni.scss全局样式文件为了方便整体控制应用风格。 默认定义了
uni-app框架内置全局变量,当然也可以存放自定义的全局变量等在
uni.scss中定义的变量,我们无需@import就可以在任意组件中直接使用使用
uni.scss中的变量,需在HBuilderX里面安装scss插件(dart-sass插件)然后在该组件的
style上加lang="scss",重启即可生效scss// uni.scss $primary-color: pink; $uni-color-primary: #007aff;vue<style lang="scss"> .content { color: $primary-color; } </style>
注意:
- 这里的
uni-app框架内置变量 和 后面uni-ui组件库的内置变量是不一样的 uni.scss定义的变量是可以全局使用,App.vue定义的变量只能在当前组件中使用
5. 页面调用接口
getApp()函数(兼容h5、weapp、app)- 用于获取当前应用实例,可用于获取
globalData
- 用于获取当前应用实例,可用于获取
getCurrentPages()函数(兼容h5、weapp、app)- 用于获取当前页面栈的实例,以数组形式按栈的顺序给出
- 数组:第一个元素为首页,最后一个元素为当前页面
- 仅用于展示页面栈的情况,请勿修改页面栈,以免造成页面状态错误
- 常用方法如下图所示:
方法 描述 平台说明 page.$getAppWebview()获取当前页面的 webview对象实例Apppage.route获取当前页面的路由 vue// App.vue <script> export default { globalData: { name: 'later' } } </script>vue// index.vue <script> export default { onLoad() { const app = getApp() console.log(app.globalData) // {name: 'later'} const pages = getCurrentPages() console.log(pages[pages.length-1].route) // pages/index/index }, } </script>- 用于获取当前页面栈的实例,以数组形式按栈的顺序给出
6. page.json
page.json全局页面配置(兼容h5、weapp、app)pages.json文件用来对uni-app进行全局配置,类似微信小程序中app.json- 决定页面的路径、窗口样式、原生的导航栏、底部的原生
tabbar等
属性 类型 必填 描述 平台兼容 globalStyleObject否 设置默认页面的窗口 pagesObject Array是 设置页面路径及窗口表现 easycomObject否 组件自动引入规则 2.5.5+ tabBarObject否 设置底部 tab的表现conditionObject否 启动模式配置 subPackagesObject Array否 分包加载配置 preloadRuleObject否 分包预下载规则 微信小程序 workersString否 Worker代码放置的目录微信小程序 leftWindowObject否 大屏左侧窗口 H5 topWindowObject否 大屏顶部窗口 H5
7. manifest.json
manifest.json应用配置Android平台相关配置iOS平台相关配置Web端相关的配置- 微信小程序相关配置

四. 内置组件和样式
1. 常用内置组件
view:视图容器。类似于传统html中的div,用于包裹各种元素内容- 视图容器可以使用
div吗?可以,但div不跨平台
- 视图容器可以使用
text:文本组件。用于包裹文本内容button:在小程序端的主题 和 在其它端的主题色不一样(可通过条件编译来统一风格)image:图片。默认宽度320px、高度240px- 仅支持相对路径、绝对路径,支持导入,支持
base64码
- 仅支持相对路径、绝对路径,支持导入,支持
scrollview:可滚动视图区域,用于区域滚动- 使用竖向滚动时,需要给
<scroll-view>一个固定高度,通过css设置height - 使用横向滚动时,需要给
<scroll-view>添加white-space: nowrap;样式,子元素设置为行内块级元素 APP和小程序中,请勿在scroll-view中使用map、video等原生组件- 小程序的
scroll-view中也不要使用canvas、textarea原生组件 - 若要使用下拉刷新,建议使用页面的滚动,而不是
scroll-view
- 使用竖向滚动时,需要给
swiper:滑块视图容器,一般用于左右滑动或上下滑动比如banner轮播图- 默认宽100%,高为150px,可设置
swiper组件高度来修改默认高度,图片宽高可用100%
- 默认宽100%,高为150px,可设置
2. 尺寸单位(rpx)
uni-app支持的通用css单位包括px、rpx(推荐单位)、vh、vwpx即屏幕像素,rpx是响应式像素(responsive pixel),可以根据屏幕宽度进行自适应- 规定屏幕宽为750rpx。如在iPhone6上,屏幕宽度为375px,共有750个物理像素。则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素
- 建议: 开发微信小程序时设计师可以用 iPhone6 作为设计稿的标准(即:设计稿宽度为750px)

3. 样式导入
使用
@import语句可以导入外联样式(css或scss)@import后跟需要导入的外联样式表的相对路径, 用;表示语句结束除了相对路径,默认是支持绝对路径的(即
@别名前缀)- 相对路径:
../../common/base.css - 绝对路径:
@/static/common/base.css
- 相对路径:
示例代码:
vue<style> @import "../../common/uni.css"; .uni-card { box-shadow: none; } </style>
4. 背景图片
uni-app支持使用在css里设置背景图片,使用方式与普通web项目大体相同,但需要注意以下几点:- 支持
base64格式图片,支持网络路径图片 - 小程序不支持在
css中使用本地文件,包括背景图和字体文件,需转成base64后使用。如何转? - 使用本地背景图片 或 字体图标需注意:
- 为方便开发者,在背景图片小于
40kb时,uni-app编译到不支持本地背景图的平台时,会自动将其转化为base64格式 - 图片大于等于
40kb,会有性能问题,不建议使用太大的背景图,如开发者必须使用,则需自己将其转换为base64格式使用,或将其挪到服务器上,从网络地址引用 - 本地背景图片的引用路径推荐使用以
~@开头的绝对路径
- 为方便开发者,在背景图片小于
css.test2 { background-image: url('~@/static/logo.png'); }注意:
- 微信小程序不支持相对路径(真机不支持,开发工具支持)
- 在背景图片小于
40kb时,uni-app编译到不支持本地背景图的平台(小程序)时,会自动将其转化为base64格式,需要将图片放到static文件夹下的一级目录中(2022.11.2测试)
- 支持
5. 字体图标
uni-app支持使用字体图标,使用方式与普通web项目相同,注意事项也和背景图片一样,使用步骤如下:- 先制作字体图标,比如:可以在
iconfont网站中生成 - 将字体图标文件引入项目,比如:
iconfont.ttf - 在全局的
css中引入字体图标,比如:App.vue
vue<template> <view> <view> <text class="test"></text> <text class="test"></text> <text class="test"></text> </view> </view> </template> <style> @font-face { font-family: 'iconfont'; src: url('https://at.alicdn.com/t/font_865816_17gjspmmrkti.ttf') format('truetype'); } .test { font-family: iconfont; margin-left: 20rpx; } </style>- 先制作字体图标,比如:可以在
