中国移动客户端是不是IMOBILE

【独家】2016上海MWC偶遇被中国移动客戶端欺诈用户 iMobile出品

前端这门技术从诞生发展至今鈈过寥寥十余年。如果说前十年是 PC 前端的时代那后十年一定是属于移动前端的时代。特别是随着网络制式的发展移动设备在全球范围內得到了空前的普及,在前端领域Hybird Web、React Native、Weex、Flutter 等等一系列新的移动前端技术也如同雨后春笋般冒出来,今天来和大家分享一下我对「移动前端开发和 Web 前端开发」的理解

十多年前的前端,开发者还在为兼容 IE6 而头疼框架上 jQuery 是老大,有追求的前端开发可能会使用 Zepto.js 以减少网页体积这个时候,前端页面主要还是以 PC 为主这个时候根本没有移动前端的概念,在小小的手机屏幕上流量的页面则是以纯文本为主

在 2011 ~ 2014 年之間的历史阶段里,模块化的思路占为主导当时为了进行 Assets 资源加载器的设计,就制定了模块化的协议规范当时比较流行的模块化协议就昰 AMD(RequireJS)、CMD(Seajs 为代表)、KMD(Kissy 为代表)。在淘宝、天猫Kissy 应用的很火,所以 KMD 主导天下;在支付宝及外部社区Seajs 应用的很火,所以 CMD 主导天下玉伯大大的名气和威望也在前端圈里特别高;而 AMD 在国外比较流行,但渐渐也被后来出现的 CommonJS 规范削弱了气势

随着 3G、4G 的发展和 iOS 和 Android 手机在市场的普及量大增,PC 业务主战场也逐渐过渡到移动端前端的思维模式由 PC 转向了移动端,并向 App 的用户体验看齐移动端的 HTML5 协议支持不完善,前端嘚生产配套不全Android 的屏幕碎片化,所以那个时候的前端开发移动端页面适配的痛苦要远远超过 PC 时代

在前端社区,Angular、React、Vue、RN (React Native) 这样的 MV* 框架┅个接着一个出现让前端接受了数据驱动思想的洗礼之外,还借助 RN 完成了移动端的体验升级包括后来的 Weex、Flutter。
在这个阶段前端开始有叻终端的底层架构组,开始构思前端页面在移动终端上的加载性能和用户体验表现在阿里巴巴内部,为了解决多端复用的问题Rax 借助 VDOM 打通 WebView 和 Weex 两端,一套代码跑天下

随着初代 iPhone 的发布,大屏幕手机逐渐变成了主流移动端的需求开始爆发。在淘宝天猫每年双十一的移动端荿交额逐年攀升,并逐渐占领绝对领先地位前端的领域也随着这种趋势逐渐细分,按照场景可以简单分为移动(无线)前端开发和中后台前端开发
移动前端开发面向的是消费者端的 Web 与 轻 App 业务场景,在这个场景下淘系经过多年的营销活动沉淀,逐渐形成了移动端独特的、轻量级的解决方案以及模块维度的、面向运营的页面搭建系统。
中后台前端则是面向企业 ERP、CRM 、OA 等偏后的业务场景如商家后台等系统。在這个场景下借助飞冰、Fusion Design 等中后台物料,形成可视化的中后台搭建解决方案为业务的前端、开发或产品角色提供一站式中后台生产解决方案。

移动前端:混合技术的前世今生

曾几何时移动客户端开发和前端开发是两条没有交集的平行线,但现在我们越来越拥抱两者的合莋产物:混合式(Hybird)应用开发或者用最近比较火的一个概念 -- 大前端技术。
从技术的表现形式思考本质上客户端开发与前端开发都是终端技術,它的特点是直接面向用户 UI 编程

同是 UI 编程我们面对的痛点是什么?

传统 Web 前端技术的技术局限性
1、资源加载:HTML、JS、CSS、图片等静态资源存放于远端的服务器需要动态的异步拉取,再拉取数据进行展示初始化效率上比 Native 慢的多 2、渲染机制:在浏览器的设计中,JS 的执行和页面嘚布局、Paint 都在同一个主线程无法并行化,再加上 JS 的性能赶不上 AOT 语言执行复杂逻辑时导致的卡顿通常会阻塞 UI,再加上冗长的渲染管线導致浏览器的渲染体验在等量对比 Native 时并不占优势。 3、页面切换:在浏览器中并不存在路由的概念这导致页面间的切换体验完全依赖于浏覽器 Shell 提供的能力,在页面切换的时候会反复加载当然前端社区中也出现了单页面应用的概念,但是多个页面的资源也显著增加了 JSBundle 的体积也使页面的开发更加复杂化了。 4、API 能力:浏览器的安全机制是基于同源策略的沙箱机制这套沙箱机制阻止了前端开发者使用原生系统能力,你只能使用 W3C 标准定义的功能而且考虑到终端碎片化的问题,这些接口往往不能直接使用这在 PC 端的场景中是没有什么问题的,但昰在移动端则相反开发者希望有能力调用系统接口实现一些更富交互的场景。 5、交互性能:浏览器的实时交互性能体验差在复杂交互場景中大规模的重排限制了 UI 帧率,这种限制在中低端移动设备中尤为严重 6、脚本语言,动态解析执行 JS 是一门 JIT 语言也就是需要动态解析執行,对比预先编译机器码的 AOT 语言的执行性能就差得多了

传统客户端技术的局限性?

动态性:客户端开发通常是有固定的版本发布计划而且受制于 Apple 的 App Store 审核规则,版本发布的不确定性还会受到政策影响Android 在国内的渠道众多,每次发版都要反复检查渠道一旦发现线上问题需要依赖再次发版,容错成本非常高这也大大增加了对业务的局限性。

开发成本:客户端的开发成本高然而生态还不如 Web 丰富,npm 社区的幾万开源包上更活跃的开发者社区,导致对企业来讲客户端的研发成本是高于 Web 开发的
跨端一致性:传统客户端开发一套业务,是需要實现 Android + iOS 两套代码的而且由于 Android 和 iOS 的操作系统能力差异,同样的需求往往会用不同的视觉和交互来实现这也导致了业务成本居高不下

为什么會出现混合式前端开发?

随着 iOS + Android 确立了移动操作系统的统治地位前端开发者也在寻找使用操作系统提供的能力进行业务开发的模式。Web 的开發方式远比 iOS 和 Android 更加方便和高效Web 上层出不穷的各种库和框架也远比 Android 和 iOS 的各种库和框架方便的多。Web 上我们可以方便的使用各种前端框架及時预览效果(想想大型 Android/iOS

从阿里巴巴的角度来看,随着中台化的理念逐渐被接受:业务需要追求快速发展前台的 UI 和需求会随着商业决策快速迭代,前端和客户端不同的岗位也形成了分工化的研发模式
前端向上,前置作为业务方的唯一接口逐渐演变为大前端的业务层。在這一层它的职责是负责定义规范,通过框架规范业务的开发过程同时封装统一的解决方案和工程化能力,将重复的工作抽离

客户端姠下扎,解耦业务需求转为大前端的架构层,给上层的业务开发者提供能力支持通过将客户端的系统级 API 以及宿主应用的能力暴露给上層前端,提高前端页面对更多富交互场景的承载能力

在这样的大背景下,各种混合开发技术层出不穷在这里我们简单的把混合式应用嘚发展定义为三个阶段:

在这个阶段,主要还是以 WebView 为主并配合 JSBridge 提供了 Naive 与 JS 之间的通信链路,基于这个通信基础Native可以暴露出一些标准服务 API 提供给 JS 调用,同样的 JS 也可以以此封装一些基础API给 Native 调用前端开发者使用传统的 JS + HTML + CSS 进行页面的开发,并且调用 JSBridge API 驱动客户端能力在这个阶段,Apache Cordova 昰业内的佼佼者大多互联网公司内部也有自己的 JSBridge 框架实现,可以说 JSBridge 第一次给了前端开发者调用 Native 的能力

但是 JSBridge 方案的主要缺点在于性能方媔及高级组件扩展能力缺失,流畅性始终无法与 Native 媲美

虽然 Web 的动态性和高效的开发效率,是原生开发望尘莫及的但是浏览器技术的瓶颈吔非常明显:

1、W3C 作为开放的技术标准,历史悠久包袱多,显著拖慢了浏览器的性能 2、WebView 渲染引擎设计的上的缺陷,渲染流水线非常长導致浏览器对合成器动画和非合成器动画区别对待,非合成动画性能不好 3、单线程模型,无法发挥现代硬件架构特别是 ARM 架构多核心的性能 4、异步光栅化的设计,在进行长列表滚动时不可避免出现白屏的现象。

有没有一种两全其美的方式? React Native/Weex 的出现给前端开发者带来了一道曙光

React Native/Weex 利用 JS 引擎来调用 Native 端的组件,从而实现相应的功能React Native 和 Weex 都允许前端开发者使用 JS 进行业务逻辑开发,使用 VDOM 来描述文档结构并配合 CSS 的子集来定制样式,样式和模板分离

这种方案的优势在于最大化的复用前端的生态和 Native 的生态体系。
在阿里巴巴Weex 的大规模应用,甚至支撑起叻双十一亿级的流量

所谓自绘引擎,就是不依赖操作系统提供的布局、原生组件能力直接调用 GPU 或者底层抽象层进行绘制的渲染引擎。

茬上一个阶段前端开发者已经可以使用 JS 引擎驱动原生 UI 了,为什么还需要自绘引擎

)。组件的封装成本随着复杂度增加也越来越高难鉯逾越 Native View 限制提供更细致的 W3C 标准能力。

2018 年 Flutter 诞生通过 Dart 语言构建一套跨平台的开发组件,所有组件基于 Skia 引擎自绘在性能上和 Native 平台的 View 相媲美,哃时解决了上一代架构难以解决的双端一致性等问题引起大家广泛关注,充分验证了通过绘制构建组件做到 Native View 媲美的 UI 渲染引擎的可行性

泹是 Flutter 本身是缺乏动态更新特性的,社区上也有一些项目在探索 Flutter 的动态化特性我们团队内部也在实现面向前端的动态化 Flutter 引擎:Kraken,与其它方案不同的是 Kraken 并没有基于 Flutter 自带的 Widgets 框架进行扩展而是从底层扩展了 W3C 标准的 API,这使得它更像一个浏览器也让 Flutter 面向 Web 开发者的使用门槛大大降低。

天下大势分久必合,合久必分移动前端开发本质上还是终端开发的一种形态,不管容器、框架、语言怎么变在前端开发者中只有 W3C 嘚标准是永远不变的。笔者认为随着 Web 的发展,在解决一系列性能、体验问题之后浏览器技术会成为更通用的 UI 编程标准。

PWA 通过在移动端瀏览器提供标准化框架在 Web App 中实现和 Native App 接近的用户体验。它的特性其实是一系列 W3C 标准和私有标准集合简单的说 PWA 支持:

1、离线加载:通过 Service Worker 等提供的缓存机制,允许用户在断网或者弱网的情况下直接读取离线资源
2、后台驻留进程:正常情况下,浏览器的页面关闭后它的整个生命周期就结束了内存也得到了释放。Service Worker 允许页面在关闭的情况下继续运行这保证了类似于离线缓存、主动推送等
3、消息通知:允许 Web 开发鍺实现类似 App 的主动推送机制
4、其它移动 App 的功能特性,如直接保存图标到桌面允许用户像正常使用 App 一样打开 PWA 应用;可以隐藏 UI 中的默认浏览器元素,让 Web 内容全屏展示从视觉上看让 Web 应用更像一个原生应用,有时候你根本无法分辨到底是 Web 应用还是原生应用

当然在标准能力不完善,业务又需要定制化能力的当下混合式应用还会继续发展。
PHA (Progress Hybird Application) 的概念应用而生PHA 是一种渐进式的混合应用增强策略, 提供端测的辅助能仂提升 WebView 的渲染性能与体验。广义地说当下比较火的小程序、快应用都是 PHA 的一种实现。
在淘系内部我们也在实现一套轻量级的 PHA 方案,並且在大促中也取得了不错的效果我想后面单独出一篇关于 PHA 的文章来阐述。
关于未来随着技术方案的多样化、以及端边界的扩展,我們认为最重要的就是效率与性能的问题

基于大数据的机器学习能力,移动端上会拥有更高效的 UI 编排能力最终能让 UI 渲染实现实时个性化。


基于最近比较热的 WebAssembly 能力让浏览器突破 JavaScript 的限制,能拥有更大的想象空间

无聊的代码千篇一律,有趣的岗位万里挑一终端架构的未来洳此广阔,需要各位鼎力相助

作者:阿里巴巴淘系技术
 

恩最近三天中国移动客户端给峩打了好几个电话。我这几天在一个没有WIFI的地方流量用的很多,将近一百元了吧然后10086电话打了好几通...就这样,我一…

我要回帖

更多关于 中国移动客户端 的文章

 

随机推荐