總體概述
現(xiàn)在比較流行的移動(dòng)APP開發(fā)框架有以下六種:網(wǎng)頁(yè)、混合、漸進(jìn)、原生、橋接、自繪。前三種體驗(yàn)與Web的體驗(yàn)相似,后三種與原生APP的體驗(yàn)相似。這六種框架形式,都有自己適用的范圍。無(wú)所謂好壞,適用就是好。
l 網(wǎng)頁(yè)應(yīng)用適用于傳統(tǒng)網(wǎng)站APP化,比如淘寶、京東,有大量WEB頁(yè)面嵌入到APP中。
l 混合應(yīng)用適用于小成本應(yīng)用開發(fā),全部代碼都基于Web,好處是開發(fā)快速、成本低。
l 漸進(jìn)應(yīng)用適用于高機(jī)會(huì)成本的場(chǎng)合,邊下載邊使用,能快速獲取,快速體驗(yàn)。
l 原生應(yīng)用適用于大型和高體驗(yàn)要求的應(yīng)用,能做出讓人滿意的體驗(yàn)效果。
l 橋接應(yīng)用適用于高速迭代的創(chuàng)意類應(yīng)用,讓體驗(yàn)與成本都處于可接受的范圍。
l 自繪應(yīng)用適用于游戲和有特殊效果的應(yīng)用,最大的好處是沒(méi)有平臺(tái)約束和表達(dá)瓶頸。
一、網(wǎng)頁(yè)WebApp
WebApp與傳統(tǒng)Web的主要區(qū)別,在于前端框架,特別是V-DOM框架的應(yīng)用。此類前端框架使得WebApp與NativeApp在機(jī)理上已經(jīng)沒(méi)有任何區(qū)別了。在眾多的前端框架中, React、Vue和Angular是最有競(jìng)爭(zhēng)力的選擇。
React
V-Dom技術(shù)的開創(chuàng)者,主流框架中的NO.1。React的貢獻(xiàn)都是開創(chuàng)性的,在它基礎(chǔ)上,也有很多兼容框架,比如Anu,Nerv。用以解決React在性能或IE兼容性上的問(wèn)題。
主流技術(shù)方案:
React + Redux + ReactRouter + Material-UI/AntD/Semantic-UI
Vue
由國(guó)人創(chuàng)建,在中國(guó)擁有大量使用者,也有很多配套的開源項(xiàng)目。它的是要特點(diǎn)是學(xué)習(xí)成本低,容易上手。
主流技術(shù)方案:
Vue + Vuex + Vue-Router + Vuetify/Quasar/vux/ Mint-UI
Angular
大而全型的框架,為大型項(xiàng)目所推崇,深度整合Typescript和Rxjs。
主流技術(shù)方案:
Angular + Typescript
二、原生NativeApp
由于操作系統(tǒng)的限制,原生應(yīng)用只有那么幾種。對(duì)于原生應(yīng)用,架構(gòu)是基礎(chǔ),框架是核心,加上海量的UI組件。
IOS
iOS開發(fā)已經(jīng)從OC全面轉(zhuǎn)向Swift,最新的架構(gòu)VIPER基本上可以視為MMVPP。
主流技術(shù)方案:
VIPER + RxSwift + Moya + Alamofire + SwiftyJSON/ObjectMapper
Android
Android開發(fā)語(yǔ)言從Java更換為Kotlin。編譯時(shí)依賴注入框架Dagger也成為不二法寶。
主流技術(shù)方案:
MVP + Dagger + RxKotlin + Retrofit + OkHttp + Kotson(Gson)
三、混合HybridApp
HybridApp的關(guān)鍵不在本身,而在WebApp。好的WebApp改為HybridApp很容易。所以混合應(yīng)用框架實(shí)際是指WebApp的基礎(chǔ)設(shè)施庫(kù),有Cordova(PhoneGap)就足夠了。
Cordova
PhoneGap開源而來(lái)。
官方網(wǎng)站:
https://cordova.apache.org/四、橋接BridgeApp
橋接應(yīng)用的特點(diǎn)在于使用原生界面,但應(yīng)用邏輯使用腳本語(yǔ)言編寫,通用橋接來(lái)控制原生界面。這樣達(dá)到使用腳本編寫原生應(yīng)用的目的,甚至可以網(wǎng)頁(yè)與原生應(yīng)用使用同一套代碼,節(jié)省大量開發(fā)成本。但是操作手感比網(wǎng)頁(yè)應(yīng)用強(qiáng)不少。
ReactNative與Weex代表了兩種不同的思路。ReactNative提供工具,將平臺(tái)差異化開放出來(lái)(Learn Once, Write Anywhere);而Weex提供框架,將平臺(tái)差異化屏蔽(Write Once, Run Everywhere)。所以ReactNative最大的痛點(diǎn)是使用難度大,必須熟悉所有平臺(tái);Weex則注定功能相對(duì)弱小,并且坑比較多。
React Native
React的大熱,實(shí)際始于ReactNative的發(fā)布。
官方網(wǎng)站:
https://facebook.github.io/react-native/Weex
小眾的框架,能不能壯大,關(guān)鍵在于學(xué)習(xí)者是否能有效率地編寫應(yīng)用。所以很多人認(rèn)為文檔是決定一個(gè)開源框架生死的關(guān)鍵。其實(shí)有幾個(gè)使用框架的開源應(yīng)用,比文檔還要關(guān)鍵。因?yàn)檫@些應(yīng)用活著,間接地證明了框架還有生存的價(jià)值和能力,也能成為更好的文檔教材。Weex號(hào)稱有一堆知名的應(yīng)用,但開源項(xiàng)目就乏善可陳了。
官方網(wǎng)站:
http://weex.apache.org/Xamarin(C#)
Xamarin在IOS與Android中的實(shí)現(xiàn)方式不一致,在IOS中是AOT直接編譯,在Android中是使用橋接技術(shù)。
官方網(wǎng)站:
http://xamarin.com/RubyMotion(Ruby)
動(dòng)態(tài)語(yǔ)言編寫移動(dòng)應(yīng)用,對(duì)語(yǔ)言社區(qū)而言是能力問(wèn)題,必須要證明語(yǔ)言的優(yōu)越性和無(wú)所不能。但除開狂熱愛(ài)好者,正確的做法是使用最有效率的平臺(tái)和語(yǔ)言。Ruby的長(zhǎng)處在于Web后端,所以編寫APP并無(wú)多少繼承性,編寫效率也由于太過(guò)小眾而存在掉坑的風(fēng)險(xiǎn)。有免費(fèi)版本,但只支持最新的操作系統(tǒng)版本。
官方網(wǎng)站:
http://www.rubymotion.com/Titanium
這個(gè)框架的核心就是使用JavaScript開發(fā)應(yīng)用,與Web開發(fā)的在形式上區(qū)別很大。所以從根本上,這就是一種腳本語(yǔ)言框架,和RubyMotion如出一轍。
官方網(wǎng)站:
http://www.appcelerator.com/五、自繪OwndrawApp
自繪一直以來(lái)都是游戲界面的勢(shì)力范圍,事實(shí)上除開Flutter,其它的框架都是偏游戲開發(fā)的。所以Flutter的橫空出世,吸引了很大的關(guān)注,畢竟這是真正跨平臺(tái)的唯一可行方案。
Flutter(Dart)
除了使用Dart語(yǔ)言有些爭(zhēng)議外,F(xiàn)lutter是真正值得關(guān)注的跨平臺(tái)方案,沒(méi)有之一。最近它的目標(biāo)平臺(tái)除開iOS 和 Android,F(xiàn)lutter Desktop Embedding項(xiàng)目將Flutter引入到桌面操作系統(tǒng),Hummingbird項(xiàng)目將 Flutter 應(yīng)用引入瀏覽器。它利用 Dart 平臺(tái)的特性不僅可以編譯原生 ARM 代碼,還可以編譯JavaScript 。這使得 Flutter 代碼可以在基于標(biāo)準(zhǔn)的 Web 上運(yùn)行而無(wú)需任何更改。
官方網(wǎng)站:
https://flutter.dev/CrossApp(C++)
CrossApp是基于Cocos2d-x引擎的,而Cocos2d-x是基于OpenGL的 。9秒社團(tuán)是由手游社區(qū)發(fā)展而來(lái)的,由此可見(jiàn)CrossApp的背景,使用C++開發(fā)也有一些忠實(shí)擁躉。
官方網(wǎng)站:
https://crossapp.9miao.com/Corona(Lua)
更適合做游戲,不適合做應(yīng)用程序,主要是因?yàn)榻缑娌糠?,官方提供的UI部分代碼非常不好用,自己實(shí)現(xiàn)又很耗時(shí)耗力。
官方網(wǎng)站:
https://coronalabs.com/Kivy(Python)
又一個(gè)動(dòng)態(tài)語(yǔ)言開發(fā)框架,和游戲引擎結(jié)合起來(lái)使得它在特定領(lǐng)域還是很有市場(chǎng)的。而且它還跨windows平臺(tái),可以在windows下直接運(yùn)行,可以真正實(shí)現(xiàn)跨平臺(tái)運(yùn)行。
官方網(wǎng)站:
https://kivy.org/六、漸進(jìn)ProgressiveApp
漸進(jìn)有邊下載邊使用這一層意思,也有下載完成后不依賴網(wǎng)絡(luò)這一層意思。從類型上來(lái)講,有Google主導(dǎo)的PWA(ProgressiveWebApp),還有微信主導(dǎo)的小程序。相比PWA一統(tǒng)天下的野心,小程序明顯是實(shí)用主義導(dǎo)向,能用就好,沒(méi)有長(zhǎng)遠(yuǎn)的布局。急于與微信競(jìng)爭(zhēng)的百度、支付寶、中國(guó)九大手機(jī)廠商聯(lián)盟的QuickApp也復(fù)制了這種風(fēng)格。隨著各種跨平臺(tái)轉(zhuǎn)譯工具(如Taro)的興起,各個(gè)小程序平臺(tái)也隨之變成了一個(gè)專有瀏覽器實(shí)現(xiàn),變成了前端千框萬(wàn)架大戰(zhàn)中的小小注腳了。
PWA
全稱Progressive Web App,即漸進(jìn)式網(wǎng)頁(yè)應(yīng)用。相對(duì)于國(guó)內(nèi)廠商的私有平臺(tái),谷歌主導(dǎo)的PWA從一開始就瞄準(zhǔn)下一代瀏覽器標(biāo)準(zhǔn)。與傳統(tǒng)網(wǎng)頁(yè)最大的不同,是引入了Service Worker了,相當(dāng)于本地服務(wù)器,能在離線時(shí)替代網(wǎng)站服務(wù)器繼續(xù)工作。除此之外,PWA大致就是一個(gè)SPA(single page web app),開放標(biāo)準(zhǔn)的繼承性還是比較高的。不過(guò)由于各平臺(tái)廠商(如微軟,蘋果)對(duì)PWA的態(tài)度不明,PWA的推廣進(jìn)展緩慢。
MiniProgram
微信小程序,由于微信的體量與使用頻度,使得小程序可以承載足夠的野心。不過(guò)從技術(shù)上講,也就是個(gè)使用人數(shù)較多的瀏覽器實(shí)現(xiàn)。小程序和大量的跟隨者,促使多端統(tǒng)一框架也發(fā)展起來(lái)了。
官方網(wǎng)站:
https://mp.weixin.qq.com/Taro
React兼容的跨平臺(tái)多端統(tǒng)一開發(fā)框架。一鍵生成可以在微信/百度/支付寶/字節(jié)跳動(dòng)小程序、H5、React Native等端運(yùn)行的代碼。雖然多端統(tǒng)一框架看似可以在不同類型的平臺(tái)運(yùn)行,但它還是要依賴那些平臺(tái)工具,還是寄居之上的小程序而已。
官方網(wǎng)站:
https://taro.aotu.io/Nanachi
司徒正美開發(fā)的React兼容Anu框架的多端轉(zhuǎn)譯腳手架。但是對(duì)比Taro是一堆工具打包而成,nanachi僅是一個(gè)腳手架,未免寒酸。不包裝一下?
官方網(wǎng)站:
https://rubylouvre.github.io/nanachi/Chameleon
類Vue的跨平臺(tái)多端統(tǒng)一開發(fā)框架。專門拜讀了昨天出爐的《Chameleon原理詳解:其它跨多端統(tǒng)一框架都是假的?》。它有神奇的多態(tài)組件,就是重新定義了一個(gè)組件聲明框架;嚴(yán)格全面的檢查,不會(huì)不讓你的代碼不能不跨平臺(tái);更多的適配代碼,聽(tīng)說(shuō)有后端統(tǒng)一接口,而且還有一個(gè)后臺(tái)管理系統(tǒng)。好吧,祝您玩得愉快。
官方網(wǎng)站:
https://cmljs.org/趨勢(shì)分析
國(guó)內(nèi)由于微信開放了小程序流量主的廣告收入,引爆了小程序的熱潮,進(jìn)一步催生了多端轉(zhuǎn)譯框架。但是這些框架所做的事并不多,引擎還是React/Vue,做了一套各平臺(tái)統(tǒng)一的UI組件而已。由于個(gè)性化的原因,UI組件是大家一直都想統(tǒng)一,而不能如愿的目標(biāo)。Taro框架也只是推銷了自己的一套UI組件而已。在我看來(lái),還不如提供一套組件“標(biāo)準(zhǔn)”,允許并鼓勵(lì)用戶自己實(shí)現(xiàn)。
如果有一套能在React/Vue,ReactNative/Weex,甚至Android,iOS,F(xiàn)lutter上使用的“標(biāo)準(zhǔn)”組件,那么全平臺(tái)大一統(tǒng),Write Once, Run Everywhere這個(gè)目標(biāo)才有可能實(shí)現(xiàn)吧。
問(wèn)題:試求React-Native、Taro、Weex、Chameleon框架組件的“最大公約數(shù)”和“最小公倍數(shù)”。
抽象的“公約數(shù)”好求,結(jié)合實(shí)現(xiàn)的“最小公倍數(shù)”只能在實(shí)踐中證明了。
框架
組件
組件名稱
抽象類型
ReactNative
View
視圖容器
<View>
Text
文本
<Text>
Image
圖片
<Image>
ImageBackground
圖片背景
<View>
TextInput
文本輸入框
<Input>
ScrollView
滾動(dòng)視圖
<View>
Button
按鈕
<Button>
Picker
選擇器
<Picker>
Slider
范圍值選擇
<Slider>
Switch
開關(guān)組件
<Checkbox>
FlatList
簡(jiǎn)單列表
<List>
SectionList
分組列表
<List>
DatePickerIOS
日期/時(shí)間選擇器
<DatePicker>
MaskedViewIOS
帶蒙版的視圖
<Modal>
ProgressViewIOS
進(jìn)度條
<Progress>
SegmentedControlIOS
分段顯示多個(gè)選項(xiàng)
<Tab>
SafeAreaView
非遮擋可視區(qū)域
<View>
SnapshotViewIOS
截屏視圖
<View>
DrawerLayoutAndroid
抽屜導(dǎo)航
<View>
ProgressBarAndroid
進(jìn)度條
<Progress>
ToolbarAndroid
工具欄
<Card>
ActivityIndicator
加載提示符
<Loading>
KeyboardAvoidingView
隨鍵盤調(diào)整視圖
<View>
Modal
模式視圖
<Modal>
RefreshControl
下拉刷新
<Trigger>
StatusBar
狀態(tài)欄
<Card>
TouchableHighlight
高亮觸摸響應(yīng)
<Trigger>
TouchableOpacity
透明度觸摸響應(yīng)
<Trigger>
Taro
View
視圖容器
<View>
ScrollView
可滾動(dòng)視圖
<View>
Swiper
滑塊視圖容器
< Swiper>
MovableView
可移動(dòng)的視圖容器
<View>
CoverView
覆蓋在原生組件之上的文本視圖
<View>
Icon
圖標(biāo)
<Text>
Text
文本
<Text>
Progress
進(jìn)度條
<Progress>
RichText
富文本
<View>
Button
按鈕
<Button>
CheckboxGroup
多項(xiàng)選擇器
<View>
Form
表單
<View>
Input
文本輸入框
<Input>
Label
表單標(biāo)簽
<Text>
Picker
普通選擇器
<Picker>
PickerView
嵌入的滾動(dòng)選擇器
<View>
Radio
單項(xiàng)選擇器
<Radio>
Slider
滑動(dòng)選擇器
<Slider>
Switch
開關(guān)選擇器
<Checkbox>
Textarea
多行輸入框
<Input>
Navigator
頁(yè)面導(dǎo)航鏈接
<Card>
Audio
音頻
<Audio>
Image
圖片
<Image>
Video
視頻
<Video>
Camera
系統(tǒng)相機(jī)
<Camera>
LivePlayer
實(shí)時(shí)音視頻播放
<Service>
LivePusher
實(shí)時(shí)音視頻錄制
<Service>
Map
地圖
<Map>
Canvas
畫布
<Canvas>
OpenData
展示微信開放的數(shù)據(jù)
<Card>
WebView
網(wǎng)頁(yè)承載容器
<Web>
Weex
a
頁(yè)面間的跳轉(zhuǎn)
<A>
div
通用容器
<View>
text
文本
<Text>
image
圖片
<Image>
list
垂直列表
<List>
cell
列表子組件
<View>
loading
容器上拉加載
<Trigger>
Refresh
容器下拉刷新
<Trigger>
recycle-list
復(fù)用列表容器
<List>
scroller
滾動(dòng)的容器
<View>
slider
輪播圖
< Swiper>
indicator
輪播圖子組件
< Swiper>
textarea
多行文本輸入
<Input>
input
輸入
<Input>
waterfall
瀑布流布局容器
<View>
video
視頻
<Video>
web
網(wǎng)頁(yè)
<Web
richtext
富文本容器
<View>
Chameleon
view
視圖容器
<View>
text
文本容器
<Text>
page
基礎(chǔ)頁(yè)面容器
<View>
block
包裝容器
<View>
cell
子列表項(xiàng)容器
<View>
scroller
可滾動(dòng)視圖區(qū)域
<View>
list
可滾動(dòng)長(zhǎng)列表
<List>
container
布局容器
<View>
row
flex布局行容器
<View>
col
flex布局列容器
<View>
carousel
輪播圖
< Swiper>
carousel-item
輪播圖子容器
< Swiper>
button
按鈕
<Button>
input
輸入框
<Input>
textarea
多行輸入框
<Input>
switch
開關(guān)
<Checkbox>
radio
單選框
<Radio>
checkbox
復(fù)選框
<Checkbox>
image
圖片
<Image>
video
視頻播放器
<Video>
c-animation
動(dòng)畫組件
<Animation>
c-toast
提示框
<Toast>
c-loading
加載中
<Loading>
c-dialog
對(duì)話框
<Modal>
c-popup
蒙層
<Modal>
c-tip
提示
<Card>
c-actionsheet
操作列表
<List>
c-tab
標(biāo)簽頁(yè)
<Tab>
c-picker
底部彈起的選擇器
<Picker>
c-picker-panel
底部彈起的控制板
<Picker>
c-picker-item
滾動(dòng)選擇器
<Picker>
c-checkbox-group
復(fù)選框列表
<View>
c-radio-group
單選框列表
<View>
c-refresh
上拉&下拉刷新
<Trigger>
<完>