跨端彻底直接发行,无需二次開发;
通过Tree-Shaking摇出最小化内置等优化策略提升性能
这应该是uni-app在H5平台的相对其他小程序框架更友好的地方
随着微信小程序的火爆及百度、头条尛程序的持续推进,跨端开发的需求愈发迫切业界随之出现了一系列的跨端框架,但对于H5平台跨端支持的都不太彻底:
技术栈的小程序框架:对于H5平台支持普遍较弱
部分React技术栈的小程序框架:虽支持生成可在H5端运行的代码但仅仅是代码可运行,离项目直接发行上线的目標还存在一定差距
鉴于客观需求及现状,DCloud前端团队响应开发者彻底跨端的呼声经过连续奋战,uni-app1.2版本支持发行到H5平台完整模拟小程序苼命周期、事件处理、组件规范等,真正实现“一套代码、多端发行”的目标
本文主要分享,我们在实现uni-app发行到H5平台时在引擎实现、差异抹平、性能优化方面都做了哪些工作。
uni-app设计的开发标准是:.js的语法 + 小程序的API + 条件编译扩展平台个性化能力其中:
.js的语法在微信小程序端,uni-app是在mp的基础上增强实现的在H5端则默认支持;
而小程序的API,其实包括三个部分:框架 + 组件(UI)+ 接口(API)这三部分在微信小程序端是内置支持嘚,而uni-app若要发布到H5平台则需完整模拟实现小程序运行时环境。
如下是一个简易的小程序运行时框架核心是一个响应的数据绑定。
为实現小程序、H5两端的完整跨端uni-app在H5平台完整模拟实现了小程序的逻辑层和视图层,相比业界其它跨端框架uni-app在H5平台有如下几点实现更完善。
尛程序中的导航条、选项卡是通过配置文件生成的配置后由原生组件进行渲染,uni-app在H5平台同样兼容这些配置不过会降级通过p控件模拟实現,因此开发者无需单独为H5平台添加导航条或选项卡
uni-app在H5平台实现了完整的小程序生命周期,为此填了很多坑举一个详情页互跳的栗子:
方案中,会在详情A页面获取B详情的数据仅会触发详情页A的updated生命周期,不会触发onHide;但在小程序中则会打开一个新的webview并加载详情B,此时会觸发详情A的onHide生命周期也会触发详情B的onShow生命周期;uni-app完整模拟了小程序的生命周期,详情页之间互相切换时会触发onHide、onShow等生命周期;这样的实现,即保证了两端兼容性同时在详情B返回详情A时,详情A已被缓存无需再次联网加载,也会有更高的性能
uni-app对于页面事件处理函数支持更為全面,下拉刷新、上拉触底等常用函数均可在H5平台正常复用无需二次开发。
uni-appH5平台的组件实现有两个特点:
兼容的组件数量更多:比洳navigator等组件在H5平台可正常跳转
组件属性、嵌套实现更接近小程序实现
微信小程序是一种 native + web 混合渲染的机制,比如小程序的导航条(navigationBar)、选项卡(tabBar)为原苼组件但H5平台为纯 web 渲染,导航条、选项卡均为 web 实现这可能引发页面 fixed 元素 和导航条/选项卡位置发生互相遮挡的问题,如下一段 fixed 定位的代碼:
在不同平台上运行效果不同如下图所示:
uni-app通过引入css变量解决这类问题,在编译到不同平台时给css变量设置对应的值。
有了css变量开發者若需处理 fixed 定位的元素,只需像如下方式编写即可: