当前移动互联网应用的开发模式主要有三种:Native、Webapp和Hybrid,关于它们的区别和优劣,相信大家已经比较熟悉了。对于web前端来说,与我们相关的是webapp和hybrid app这两种应用形态,其中又以hybrid应用更为广泛。随着近年来前端技术的发展,基于web技术的移动端应用的体验逐步向原生靠近,涌现出一批优秀的移动端web开发框架。本文结合自己在mini项目中的调研和实践,对移动端web开发的一些代表性框架做一个简单的介绍。
#移动端开发模式
Native、Webapp和Hybrid
单页应用(SPA)
对于移动端web应用来说,为了达到媲美原生应用的效果,单页架构几乎是不可或缺的。传统的多页面的应用在页面跳转时需要从服务器加载html并重新渲染,会出现明显的“白屏”现象,对于一个移动端“应用”来说这是不可忍受的。因此,大部分移动端框架选择或支持了单页的开发方式。那么,单页应用都有哪些优点呢?
单页应用的优势
- 页面无刷新切换
- 页面切换速度快,体验流畅
- 动画转场效果
- 前后端分离
单页应用必须具备的功能
- 能够管理页面状态的路由系统
- 子页面调度模块
- 数据管理模块
- 页面切换的转场效果
具有代表性的移动端单页框架
- Angular.js
- React Native
- Vue.js
- MobileBone.js
Angular.js
- 大而全的MVC框架
- $routeProvider提供前端路由支持
- controller实现模块调度
- ng-view进行局部渲染
- ngAnimate创建动画效果
demo
html
<body ng-app="myApp">
<div class="header">header</div>
<div ng-view></div>
<div class="footer">footer</span>
</body>
js
angular.module('myApp', ['ngRoute'])
.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
.when('/detail/:id', {
templateUrl: 'views/detail.html',
controller: 'DayCtrl'
})
.otherwise({
redirectTo: '/'
});
})
优缺点
优点:
- 功能完善,提供了一整套解决方案
- 数据绑定、依赖注入、单页路由、自定义指令
- MVC架构,分层清晰
缺点:
- 框架过重,对移动端而言体积过大
- “脏检查”效率低下
- 没有明确的组件化概念
- 动画转场效果实现较为困难
React Native
- 基于React.js的组件化机制
- js编写的React组件渲染为原生组件
- Navigator组件实现页面导航和路由
- 路由模块通过实例化不同组件实现模块调度
- Flux架构的数据和状态管理
- 基于原生UI的动画效果
demo
// 主模块
class MainView extends Component {
// ...
render() {
return (
<Navigator
//样式
style=
//初始化路由
initialRoute=
//配置场景动画
configureScene={this.configureScene}
//根据路由渲染组件
renderScene={this.renderScene}
/>
);
}
}
//renderScene方法
renderScene(route, navigator) {
if (route.name == 'Home') {
return <Home navigator={navigator} {...route.passProps}/>
} else if (route.name == 'Detail') {
return <Detail navigator={navigator} {...route.passProps}/>
}
...
}
优缺点
优点
- 完善的组件化机制
- 基于Virtual Dom的数据绑定效率很高
- javascript组件最终渲染为原生组件
- 可以达到接近原生应用的体验
- learn once,write anywhere
缺点:
- 依赖原生组件暴露出来的组件和方法
- 一定程度上牺牲了web的灵活性和扩展性
Vue.js
- 新兴的轻量级MVVM框架
- vue-router提供路由支持
- 路由模块通过实例化不同组件实现模块调度
- Flux架构的数据和状态管理
- 基于transition特性的CSS/动画过渡系统
demo
demo.vue
//模板
<template>
<nav>
<li><a v-link="/home">首页</a></li>
<li><a v-link="/detail">详情</a></li>
</nav>
<div class="container">
<router-view></router-view>
</div>
</div>
</template>
<script>
...
//路由
const router = new VueRouter()
router.map({
'/home': {
component: Home
},
'/detail': {
component: Detail
}
})
router.redirect({
'*': '/home'
})
</script>
优缺点
优点:
- 完善的组件化机制
- 轻量,~24kb min+gzip
- 高效,基于defineProperty的数据绑定
- 快速,异步批量DOM更新
缺点:
- 新兴框架,资料较少
- 社区规模较小,影响力有限
- 框架不够成熟
MobileBone.js
- 轻量webapp单页切换骨架
- 基于hash、H5 history API 和锚点定位的路由
- 通过子页面的id匹配对应路由
- 通过子页面进入和离开时的回调来调度模块
- 可定制的动画转场效果
demo
作者提供的demos: http://rawgit.com/zhangxinxu/mobilebone/master/test/index.html
优点和缺点:
优点:
- 轻量级,插件级别的框架
- 可智能识别页面切换方向
- 动画效果可自定义
缺点
- 页面切换不支持传参
- 仅提供了切换骨架,应用的管理完全需要手动
- 代码组织不够优雅