尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

uni-app X与uni-app究竟有什么不同?

uni-app X与uni-app究竟有什么不同? uni-app经典版与uni-app x是 DCloud 推出的两代跨平台开发框架。1. 核心架构与渲染机制对比 (Architecture)维度uni-app (经典版)uni-app x (下一代原生引擎)App端渲染引擎混合渲染Webview / Vue / nvue 混合纯原生渲染(No WebView无 JS 引擎瓶颈)App编译产物JS bundle 运行时打包在 App 中Android 编译为纯Kotlin/Java原生代码iOS 编译为纯Swift/OC原生代码性能与流畅度存在 JS-Native 跨线程 Bridge 通信开销复杂长列表容易卡顿原生 60~120 FPS 流畅度启动速度提升数倍内存占用大幅降低Web / 小程序端编译为 Vue 视图和小程序代码同样编译为 HTML/JS 及小程序原生代码保证多端一致2. 编程语言与语法区别 (Language Syntax)维度uni-app (经典版)uni-app x组件文件后缀.vue/.nvue.uvue逻辑文件后缀.js/.ts.uts(Uniapp TypeScript)语法规范Vue 2 或 Vue 3 (JavaScript/TypeScript)仅 Vue 3 语法(Composition API / Options API)类型系统弱类型 JS 或可选 TS运行时仍为 JS编译期强类型系统 (UTS)要求明确声明类型不能随意给变量赋不兼容类型对象与 JSON任意 JS 动态对象{ a: 1 }需使用UTSJSONObject或显式定义type/interface//示例 { name: patientConsultation, path: /pages/patient/consultation/index, needAuth: true, roles: [patient] as ArrayUserRole } //这里的 as ArrayUserRole 显式类型断言就是标准的 UTS 强类型写法。3. 组件系统对比 (Components)基础组件扩展uni-app基于 Web/小程序组件规范。uni-app x所有视图元素映射为原生 UI 节点如 AndroidView/ViewGroupiOSUIView。长列表性能uni-app长列表需要依靠nvue或复杂优化手段否则数据量大时渲染卡顿。uni-app x内置原生list-view和waterfall-view组件自带原生节点复用机制数万条数据滑动依然极其流畅。(详见文章list-view与waterfall-view详解4. 样式与 CSS 规范差异 (Styling CSS)这是从uni-app迁移到uni-app x最需要注意的地方维度uni-app (经典版)uni-app x布局引擎Webkit / Chromium 浏览器 Layout原生Yoga Flexbox布局引擎CSS 覆盖范围几乎完全支持标准 CSS 规范包含 Grid、层级选择器等仅支持 CSS 子集只支持 Flex 布局默认display: flex/flex-direction: column选择器限制支持.a .b后代选择器、伪类选择器等仅支持简单类选择器(.class) 和标签选择器 (view)不支持复杂的后代/组合选择器为了原生解析极速性能单位支持px,rpx,rem,vh,vw,%等主要是px,rpx,%5. API 与 原生能力拓展 (APIs Native Capability)uni.全局 APIuni-app x绝大多数标准 API如uni.request,uni.setStorageSync,uni.navigateTo与经典版完全一致。部分依赖 Web DOM 的历史 API 被替换为更高效的原生 Element API。直接调用原生 SDK零 Bridgeuni-app (经典版)如果需要调用原生 Android/iOS SDK必须编写 原生 UniPlugin 插件通过 JS Bridge 进行异步序列化通信。uni-app x在.uts文件中可以直接import原生 Android (Java/Kotlin) 或 iOS (Swift/OC) 的系统库及第三方 SDK直接执行原生方法调用没有跨语言传输损耗。6. 总结对比表开发者如何选择与应对比较维度uni-app 经典版uni-app x适合场景传统 H5/小程序/轻量 App 快速开发已有大量 Web 生态包项目对App 原生性能、流畅度、启动速度有极致要求的应用如医疗健康、社交、直播、复杂业务 App生态兼容可直接引入普通 npm 库如 lodash, axios 等依赖 JS 运行时的包原生 JS npm 包需改造或替换为 UTS 原生适配包UI 库需采用针对 uni-app x 开发的原生 UI 组件学习曲线低只要懂 Vue CSS 即可中需掌握严格的 UTS 强类型以及 Flex 布局限制7.uniappX开发注意从传统的uni-app切换或迁移到uni-app x开发者需要经历一次从“Web 混合思维”向“纯原生编译思维”的转变。以下是uni-app x开发中最容易踩坑、必须着重注意的 6 大核心区别均附带具体代码对比一、 语法与类型系统UTS 强类型限制 (最核心变动)在传统uni-app中使用 JavaScript变量类型可以随意变动对象可以随意动态加属性。但在uni-app x的 UTS 语言中编译期有着严格的强类型约束。1. 变量类型不可动态改变且不支持随意any❌错误示范 (经典 uni-app / JS 思维)let data hello data 123 // 报错型别已确定为 string不能赋值为 number✅正确示范 (uni-app x / UTS)let data: any hello // 若确定要动态变化需显式声明 any尽量少用 let count: number 1232. 对象不能随意动态追加属性 (必须用type或UTSJSONObject)❌错误示范let user { name: 张三 } user.age 18 // 报错对象字面量初始化后属性固定不能动态添加未定义的属性✅正确示范 (方案 A推荐定义 Interface/Type)type User { name: string age?: number // 声明可选属性 } const user: User { name: 张三 } user.age 18 // 正确✅正确示范 (方案 B使用UTSJSONObject字典)const user { name: 张三 } as UTSJSONObject user[age] 18 // 正确关于UTSJSONObject详见为什么 uni-app x 需要 UTSJSONObject二、 CSS 样式规范简化的原生 Flex 布局App 原生端采用了 C 的 Yoga Flex 布局引擎不再支持标准 Web 浏览器的全部 CSS 特性。1. 选择器限制不支持复杂层级后代选择器与伪类❌错误示范 (经典 CSS)/* 报错或无效不支持层级嵌套选择器、属性选择器、伪类 */ .parent-box .title { color: red; } .item:nth-child(1) { margin-top: 0; } input[typetext] { background-color: #fff; }✅正确示范/* 必须使用扁平的单 Class 选择器或标签选择器 */ .title { color: red; } .first-item { margin-top: 0; }2. 默认布局均为display: flex; flex-direction: column;在.uvue中所有view默认就是 Flex 布局且垂直排列。❌错误示范以为元素像 HTMLspan或a一样默认横向排布。✅正确示范如果要横向排布必须显式加上flex-direction: rowview styleflex-direction: row; align-items: center; image src... stylewidth: 20px; height: 20px;/image text横向排列的文字/text /view3. 页面与容器全屏拉伸必须显式设flex: 1❌错误示范子组件写height: 100%期望撑满全屏结果在 App 端高度为 0。✅正确示范从页面根节点到内部容器必须层层设置flex: 1才能正确占用剩余全屏高度。三、 长列表组件弃用view v-for强制使用list-viewlist-item❌错误示范 (经典 uni-app 习惯) 在 App 端用scroll-view或普通view包裹v-for渲染数千条数据。这会导致创建数千个原生 View 节点造成手机内存暴涨甚至 App 崩溃。!-- 传统写法在 App 端性能极差 -- scroll-view scroll-y view v-foritem in list :keyitem.id.../view /scroll-view✅正确示范 (uni-app x 原生复用列表) 必须使用list-view搭配list-item并给不同布局指定type属性list-view scroll-y styleflex: 1; list-item v-foritem in list :keyitem.id :type0 text{{ item.name }}/text /list-item /list-view四、 NPM 生态与 DOM/BOM 依赖❌错误示范在项目里npm install axios/lodash/html2canvas并在 App 端使用。原因普通的 Web npm 包内部大量使用了window、document、location或 JS 独有的动态反射能力。在uni-app xApp 端的纯原生环境无浏览器上下文下运行会直接抛错报错。✅正确示范网络请求统一使用uni.request()。工具函数使用 UTS 内置的数组/字符串方法或使用专为 uni-app x / UTS 开发的生态插件。五、 JSON 解析与类型转换 (JSON.parseObject)❌错误示范 在 JS 中JSON.parse(jsonStr)可以直接转为任意对象并点出属性。但在 UTS 中直接强转自定义type会在 App 端引发类型转换异常。const user JSON.parse(jsonStr) as User // 风险写法✅正确示范 使用 UTS 提供的JSON.parseObject()安全解析const obj JSON.parseObject(jsonStr) if (obj ! null) { const name obj.getString(name) // 安全获取字符串属性 const age obj.getNumber(age) }六、 极简原生直连直接内联 Android / iOS 原生代码这是uni-app x的巨大优势亮点在.uts文件中你可以利用条件编译直接调用 Android Kotlin 或 iOS Swift 的原生 API无需再写原生 Plugin。实战例子在 UTS 中直接调用 Android 原生 Toast 弹窗// common/native-utils.uts #ifdef APP-ANDROID // 直接 import 原生 Android 包 import Toast from android.widget.Toast export function showAndroidToast(msg: string) { // 直接调用 Android 原生 API Toast.makeText( uni.getAndroidApplicationContext(), msg, Toast.LENGTH_SHORT ).show() } #endif #ifdef APP-IOS import { UIAlertController } from UIKit export function showIOSToast(msg: string) { // 直接写 Swift 原生逻辑 } #endif总结备忘清单关注维度传统 uni-appuni-app x数据类型JS 动态弱类型UTS 编译期强类型(无隐式转换对象需定义 type / UTSJSONObject)CSS 选择器支持多层后代、伪类只支持单 Class (.class) 选择器默认均为 Flex 布局长列表scroll-view/view必须使用list-viewlist-item :type0NPM 依赖可用普通 Web npm 包不可用依赖 DOM/BOM (window/document) 的 Web npm 包原生扩展编写 Java/OC 离线插件在.uts中直接import调 Android/iOS 原生 API
返回列表