Web前端开发与iOS终端开发的异同

  语言javascript

  前端和终端做为面向用户端的程序,有个共同特色:须要依赖用户机器的运行环境,因此开发语言基本上是没有选择的,不像后台想用什么就用什么,iOS只能用Objective-C,前端只能javascript,固然iOS还能够用RubyMotion,前端还能用GWT/CoffieScript,但不是主流,用的人不多,真正用了也会多出不少麻烦。php

  这二者有个有意思的对比:变量/方法命名的风格正好相反。苹果一直鼓吹用户体验,写代码也不例外,程序命名都是用英文全称而且要多详细有多详细,力求看变量和方法名就能知道是干吗的,例如application:didFinishLaunchingWithOptions:。而js由于每次都要从网络下载,要力求减小代码体积,因此变量方法名是尽可能用缩写,实际上有代码压缩工具,不管变量名写多长最终上线的效果是同样的,但你们也都习惯了用短的命名,例如上述objc的application:didFinishLaunchingWithOptions:方法在js里习惯的命名是:$()。css

  objc与js都是动态语言,使用起来还蛮像,但objc是编译型,速度快,不少错误也能在编译过程当中被发现,js是解释型,性能依赖于解释引擎,即便在强劲的v8引擎下性能也赶不上编译型语言,语言太动态,变量彻底没有类型,写起来爽,debug起来稍微费点劲。一直感受js轻巧灵活放荡不羁充满各类奇技淫巧,objc中规中矩没c++ java那么严肃也没有js那么灵活。html

  线程前端

  前端开发几乎不须要线程这个概念,浏览器实现上页面HTML和CSS解析渲染可能与js不在同一个线程,但全部js代码只执行在一条线程上,不会并发执行,也就不须要考虑各类并发编程的问题。在新的JS特性中能够建立worker任务,这样的任务是能够另起一条线程并行执行的,但因为并非全部浏览器都支持,不一样线程传递数据各个标准定的还不同,使用场景也少,彷佛没有大规模用起来。对于数据库操做/发送网络请求这样的任务是在不一样于js代码执行线程的,不过这些都由浏览器管理,前端无需关心也没法影响这些线程,只需接收事件回调,不须要处理任何并发问题。html5

  终端开发须要大量使用多线程,iOS有一条主线程,UI渲染都在这个线程,其余耗时长的逻辑或者数据库IO/网络请求都须要本身另开线程执行,不然会占用主线程的时间,致使界面没法响应用户交互事件,或者渲染慢致使滚动卡顿。程序逻辑分布在多个线程里跑,须要处理好各类代码并发执行可能带来的数据不一致/时序错乱之类的问题,并发也致使有些bug难以排查,一不留神就掉坑,须要适当用一些队列/锁保证程序的执行顺序。iOS提供了一套多线程管理的方法GCD,已经把线程和队列封装得很是简单易用功能强大,比其余端或后台是好不少了,但仍是会花大量功夫在处理多线程问题上。java

  存储c++

  终端开发须要大量的数据存储逻辑,手机APP不像浏览器,用户打开浏览器一定是连着网,但打开一个APP时极可能是离线,也极可能处于网络情况极差的移动GPRS,因此必须把以前请求回来的数据保存好。保存数据后又须要与服务端最新的数据同步,若是全量同步数据量太大,耗流量速度也慢,因而须要增量同步,须要与服务端一块儿制定实现增量数据返回的方案,须要处理好客户端与服务端数据一致性的问题。当数据存储量大结构复杂时,还须要利用好有限的内存作cache,优化各种存储查询性能。chrome

  前端在桌面端不多须要存储,除非是Single Page App,不存储天然就不须要数据更新的一系列工做,数据都是从后台取出拼接后直接显示到页面上,即便像微博有能够在页面内不断加载更多数据,数据也只存在于内存,不会持久化存储,由于桌面端网速稳定,不计流量,全部数据能够直接从后端拿取,客户端不必再作一套存储。移动端那些作得很像原生APP的Web应用就跟终端开发同样了,数据一样保存到SQLite,存储逻辑以及要处理的问题都差很少。数据库

  框架

  在第三方框架上Web前端和iOS开发彻底相反,Web原生弱小又十分开放,让大量第三方框架和类库能够施展拳脚,而iOS原生强大又十分封闭,致使第三方框架没有多少生存空间。

  浏览器一开始只为内容型的网页而设计,js也只是这个网页上能加点小特效的脚本语言,在Web应用时代跟不上发展,须要不少第三方库和框架辅助,再加上前端开发是彻底开放的领域,致使库和框架百花齐放多如牛毛,在初期多数库的做用集中在封装dom操做,你们不断重复造dom操做基础库的轮子,在一段时间百家争鸣后独尊jQuery,在有使用库的网站中90%以上使用jq,几乎成了个标准基础库。后期你们已经再也不重复造这个基础库的轮子了,多了一些代码组织和前端架构的框架,例如一些帮助项目模块化的框架require.js,MVC框架backbone/angular.js等。

  iOS开发苹果已提供了完整的开发框架cocoa,而这框架在每一代系统中都在升级优化和添砖加瓦,开发模式也已经定型,第三方框架没有多少生存空间,大量流行的开源项目是一些通用组件和库,像网络请求库AFNetworking,数据库操做库FMDB。而一些大的框架像beeFramework/ReactiveCocoa较难流行起来。

  兼容

  前端开发须要兼容大——量的浏览器,桌面的chrome,safari,ie6-ie10,firefox,以及各类套壳猎豹360等浏览器,移动端iOS/Android各自的浏览器,以及无限的不一样的屏幕尺寸。看起来挺可怕,实际上也没那么难搞,只是拿出来吓唬下人。桌面端chrome/safari以及各类套壳的极速模式用的都是Webkit,差别很小,firefox也大致听从标准实现,与Webkit差异不大,旧的ie6/7就须要特别照顾,不过不少网站都不支持ie6了,移动端更是一家亲,全是Webkit,除了新特性上的支持程度不一,其余差别不大。对于不一样的屏幕尺寸,高端点的会用响应式布局,针对不一样屏幕尺寸自适应到不一样布局,通常点的桌面端定死宽度,移动端拉伸自适应宽度就搞定。

  终端开发也须要兼容各类不一样的系统版本和手机尺寸,Android不用说,iOS也有3.5/4/4.7/5.5/9.7英寸这些尺寸,不过兼容起来跟Web同样挺容易,就是自适应宽度,iOS的UIKit把这些都处理好了,还有autolayout,sizeClass等高级特性可用,在尺寸上并不用花太多功夫。系统版本上iOS7为分水岭,iOS7先后版本UI上差别比较大,须要作一些功夫兼容,不过iOS用户更新换代很快,预计再过一两年iOS7如下用户就能够忽略了。

  性能

  终端和前端都是面向用户的,性能优化目的都是尽快呈现内容,以及让程序在用户操做下流畅运行。终端主要关注的是存储/渲染性能。当一个APP存储数据量大,数据关系复杂时,数据查询很容易成为性能瓶颈,须要不断优化数据存取的效率,规划数据IO线程,设计内存cache,利用好终端设备有限的内存,渲染上避免重复渲染,尽量复用视图,寻找最高效的渲染方案。

  前端关注页面加载速度,因为Web页面的结构/样式/程序/资源图片都是实时请求的,要让页面更快呈现内容,就要优化这些请求,让这些资源以最快速度加载下来,包括合并图片/合并代码减小请求数,压缩代码,并行请求,根据版本号缓存代码请求,gzip压缩,模块/图片懒加载等。此外跟终端同样也关注渲染性能,听从一些规则避免页面reflow,避免使用CSS阴影这样耗性能的特效,用CSS3动画代替js等。

  编译

  终端开发须要编译的过程,把程序编译成机器语言,再与各类库连接后生成平台对应的可执行文件,最后由操做系统调度执行。在iOS终端开发中编译和连接的规则苹果已经在xcode这个开发工具上封装好,通常开发能够不用关心,但有深层需求时仍是须要跟编译打不少交道,例如用编译前端Clang自定义静态代码检测规则,写编译脚本作自动化编译和持续集成,打包生成静态库,根据连接后的可执行文件的组成优化APP体积等。

 前端开发的程序则不须要编译过程,只须要把代码扔给浏览器,浏览器边解析代码边执行。虽然js/css代码写完无需作任何事情浏览器就能够解析执行,但为了上面说的性能优化,前端代码上线前会对全部代码和资源文件进行处理,这些处理包括:压缩合并js/css,合并css sprite图,处理模块依赖,处理代码资源版本号,处理资源定位等。这个过程很像传统程序的编译,把给人看的代码优化处理成给机器看的,并解决一些依赖关系,能够算是前端的编译过程。像grunt.js/fis这些工具能够帮助完成这个编译过程,一般前端编译跟上线部署结合在一块儿,做为上线系统的一部分。

  安全

  前端和终端的安全性问题上虽然不须要像后端考虑得那么多,但仍是有些须要注意。在请求的安全上,终端和前端都同样,用户向后端发送的请求都须要通过层层路由,不知道在哪里就被截获篡改或回放了,因而须要作一些措施防护这些状况,最多见的就是身份验证,可能是采用会过时的token形式代替用户名密码,防止被抓包后黑客能够永远登录这个帐号。数据安全要求高的会用加密传输,或者使用https,另外还须要看状况处理一些DNS劫持,运营商广告植入等问题。

  其余安全问题终端不多考虑,在未越狱的iOS机器上系统已经帮忙保证了整个APP运行环境的安全,而在越狱的机器下恶意程序拥有root权限能够作任何事情,APP也难以防范。前端方面浏览器的特性使前端开发有几个安全隐患,一是Web页面上任意位置均可以动态插入js代码,浏览器会无区别地执行这些代码,二是身份验证信息都统一保存在cookie里,三是页面上能够随意经过iframe嵌入其余网站的页面。形成XSS、CSRF、cookie劫持这些攻击手段,因此前端写代码时都须要考虑还这些安全问题,作好相应的防范,最简单和重要的防范就是对全部用户输入输出的内容作完整的过滤,避免页面内被嵌入恶意代码。

  交互/开发

  最后说下对这两个领域在交互和开发上的我的感触。之前在作Web前端时,感受Web让人机交互倒退了十年,交互都是硬邦邦的点击—啪一下出来结果,滚动是一格格地刷新,不少人当时在鼓吹html5能够作出多么炫的效果时,实际上FLASH在十年前就能够作出来了,还比最现代的浏览器更流畅。iPhone流行后,人机交互终于恢复了应有的水平,体验上比Web流畅太多,指尖交互/流畅的动画/便捷的滑动手势/无限制的实现,主流终于恢复或超越了十年前Flash的水平。

  但人机交互提高了,开发方式却大倒退,Web的开发方式很是先进,用户用到的都是最新版本,发现bug能够立刻上线秒修复,特别适用于互联网环境下的快速迭代,而终端APP不行,撇开iPhone的审核不说,Android也没法作到保证用户用的是最新的程序,用的都是传统的客户端更新的方式,bug的修复版没法及时给到用户,没法一天上线几十次,须要维护不少旧版本,开发方式倒退回Web时代之前。这都是由于移动网络不稳定以及流量有限形成的,移动端没法像桌面端浏览器那样彻底依赖网络,因此在移动网络稳定流量免费以前,开发方式都不会有多大变化。

  另外并不看好HTML5,网络上说它能够取代APP说了三四年,到如今也没什么战绩,我看不到它的优点,原生APP能够得到更多的系统资源,更流畅的人机交互体验,HTML5在这方面永远比不上,而它在移动端网络和流量的限制下也没法发挥Web的开发优点,因此它不会成为主流,只适合作一些轻量的小东西。

相关文章
相关标签/搜索