標(biāo):實現(xiàn)一個可以安裝在手機上運行的,ui效果很好的app (開飯了)。
前端框架匯總:
框架其實就是優(yōu)秀的代碼,幫助封裝了工具、類庫等,提高開發(fā)速度。
jQuery: js的庫 簡化DOM操作
jQuery UI : 是一個html組件庫,實現(xiàn)PC端應(yīng)用
bootStrap: 響應(yīng)式 pc+移動端 偏向于PC端
angularJS: 是一個實現(xiàn)SPA的js的MVC框架,數(shù)據(jù)操作比較頻繁
Ionic:h5的實現(xiàn)移動端應(yīng)用程序的框架,集成了ng、cordova、ui庫、uiRouter
PhoneGap/cordova:通過plugin插件的形式 提供了豐富的js API,實現(xiàn)原生應(yīng)用程序才能調(diào)用的功能(hybridApp)
配對組合:框架之間的定位是否有相同的部分
jQuery+jQueryUI
jQuery+bootStrap
jQuery+ng 不建議
jQuery+Ionic(ng+phoneGap+ui) 不建議
jQueryUI+bootStrap 不建議
jQueryUI+ng
jQueryUI+Ionic 不建議
bootStrap+ng
bootStrap+Ionic 不建議
技術(shù)選型
①考慮生態(tài)圈
②明確框架的賣點
③根據(jù)需求,選擇
④技術(shù)是否有定位有很多相似的地方,如果是,建議選其中最好的
ionic (css\ion-list$ionicLoading + uiRouter )
目的:實現(xiàn)移動端的app(開飯啦)
技術(shù)構(gòu)成: ionic
('ui庫->內(nèi)容'+
'ng->數(shù)據(jù)'+
'uiRouter->處理路由'+
'打包:部署在服務(wù)器')
①完成腳手架的搭建
②模擬數(shù)據(jù) 把頁面展示出來
③聯(lián)調(diào),在前端調(diào)用后端的接口進行調(diào)試(邊做邊測試)
④部署到生產(chǎn)環(huán)境
1、項目的搭建(15:45 - 16:10)
①、創(chuàng)建項目,添加css、js、img、tpl文件夾,添加必須引用的css、js文件,添加自定義的css、js文件以及img圖片,并創(chuàng)建完整的引導(dǎo)頁面kaifanla.html;
②、編寫kaifanla.html文件:
定義模塊ng-app=”kaifanla”
引入ionic.css以及自定義的css文件
定義用于替換模板的視圖
引入ionic_bundle.js文件,并引入自定義的js文件
③、添加模板文件:添加 start/main/detail/order/myorder頁面,每個頁面中刪掉原有內(nèi)容,添加一個文字;
④、編寫 kaifanla.js 文件
定義各自的控制器
定義路由:為所有模板定義路由,默認跳轉(zhuǎn)到start
⑥、測試:跳轉(zhuǎn)是否正常,是否有錯誤
2、所有靜態(tài)頁面的編寫---》運行通暢,數(shù)據(jù)靜態(tài)死數(shù)據(jù)
①start.html (16:25 - 16:40)
1.1 頁面布局
1.2 實現(xiàn)該頁面時,將通過js跳轉(zhuǎn)的方法封裝在控制器中(所有的代碼片段都可以去用)
②main.html 模擬數(shù)據(jù)
http://ionicons.com/
可以通過ng-include包含頁頭和頁尾
has-header has-footer --> ion-content
③detail.html 詳情頁
card
(9:45 - 10:10)
④order.html 表單提交頁
⑤myOrder.html 個人中心頁
通過grid 模擬 table 展示數(shù)據(jù)
每日一練:
完成所有的靜態(tài)頁面。
3、調(diào)用php頁面,聯(lián)調(diào)
在進行聯(lián)合調(diào)試時,如果遇到了問題?
①確認請求的api接口是否正確
②請求服務(wù)器端時,確保參數(shù)的個數(shù)和類型服務(wù)要求
③服務(wù)器端返回的數(shù)據(jù)是否正確
④經(jīng)常去看network(response\header)、console
條件:
①工程在c:\xampp\htdocs
②xampp的apache和mySql跑起來
③測試-》 localhost: / (不要直接在webStorm中打開)
要求:通過service創(chuàng)建一個自定義服務(wù)$kflHttp,
①在服務(wù)中封裝一個方法sendRequest(url,func),在這個方法中有兩個參數(shù),第一個是要求的地址,第二個參數(shù)是請求成功之后要執(zhí)行的處理函數(shù);
②在sendRequest方法被調(diào)用時啟動一個‘正在加載數(shù)據(jù)’的窗口,當(dāng)成功的請求到服務(wù)器端的數(shù)據(jù),關(guān)閉加載中的窗口。
①main.html
ng-model
-->
初始化模型數(shù)據(jù):$scope.inputTxt={kw:''};
$watch : $scope.$watch('inputTxt.kw',function(){})
方向2的數(shù)據(jù)綁定: ng-model='inputTxt.kw'
嘗試: ion-infinite-scroll 上拉加載更多
第一步:要將ionInfiniteScroll放到頁面底部
第二步:on-infinite
第三步:$scope.$broadcast('scroll.infiniteScrollComplete');
②detail.html (2:15 - 2:30)
發(fā)送: main->a
接受: detail
1、配置detail狀態(tài)中的url /detail/:id
2、$stateParams
③order.html(14:50 - 15:20)
接收detail傳遞來的參數(shù):菜品的id
點擊下單,將數(shù)據(jù)一起發(fā)給服務(wù)器端,根據(jù)服務(wù)器返回的結(jié)果,將表單隱藏顯示下單結(jié)果
序列化:
$HttpParamSerializerJQLike
④myOrder.html
根據(jù)手機號 去查找所有的訂單
⑤設(shè)置頁面
在點擊設(shè)置的時候,有一個設(shè)置頁面(顯示一個列表:關(guān)于--點擊顯示自定義彈窗,退出登錄--點擊回到起始頁)
自定義彈窗:
①創(chuàng)建一個自定義彈窗
②顯示
注冊邀請:http://t.cn/RqG1Nja
混合編程:
打開eclipse,將模擬器,新建一個Android應(yīng)用,通過webView的loadUrl
wv.loadUrl('http://172.163.0.1/ionic_kaifanla/kaifanla.html');
方式1:
將前端工程的全部代碼 拷貝到 assets目錄
方式2:
將前端代碼放在服務(wù)器,拿到服務(wù)器的url地址(不需要拷貝assets)
①確保前端代碼沒問題
②將代碼部署在服務(wù)器
③編寫java代碼
//創(chuàng)建WebView類型的一個變量
WebView wv=newWebView(getApplicationCotnext());
//允許執(zhí)行js
wv.getSettings().setJavaScriptEnabled(true);
//載入指定的頁面
wv.loadUrl("http://172.173.0.100/chaptor4/webApp/kfl_ionic/kaifanla.html#/settings");
//設(shè)置內(nèi)容視圖
setContentView(wv);
添加網(wǎng)絡(luò)權(quán)限:
上午:
迭代
在之前的基礎(chǔ)上:start main detail order myOrder
加入購物車。
詳情頁:立即下單--》添加到購物車
中間多了購物車的標(biāo)簽: 跳轉(zhuǎn)到購物車頁面,購物車支持產(chǎn)品數(shù)量的編輯。
一、ZeptoJS概述
http://zeptojs.com/
what?是一個接口和JQuery比較類似的js的庫,它的目標(biāo)是實現(xiàn)一個10k以內(nèi)的通用的模塊化的js的庫
注意事項:ZeptoJS只是實現(xiàn)了JQuery一部分的功能,也有自己的和移動端相關(guān)的處理。
where?
針對現(xiàn)代高級瀏覽器,在手機端用的比較多
why?
①非常輕量
②有著熟悉的api接口(開發(fā)者不需要太高的學(xué)習(xí)成本)
③非常方便的搭配其他庫去使用
④核心庫的性能比較好,舍棄了低版本的兼容的支持
how?
引入對應(yīng)的zepto.js文件到工程
在zepto.js中內(nèi)置:
zepto核心模塊;包含許多方法
event通過on()& off()處理事件
ajaxXMLHttpRequest 和 JSONP 實用功能
form序列化 & 提交web表單
ie增加支持桌面的Internet Explorer 10+和Windows Phone 8。
二、ZeptoJS Core Module
2.1 操作數(shù)據(jù)的基本方法:
each/map/grep/parseJson/isFunction/isPlainObject.....
2.2 常見的選擇器
id、標(biāo)簽、父子、后代、
class、屬性($('[name=test]'))
2.3 簡化DOM操作的方法
增刪改查
2.3.1 增
insertAfter insertBefore append appendTo prepend prependTo
2.3.2 改
html()
css()
addClass()
width()
height()
2.3.3 刪
remove
removeClass()
2.3.4 查
三、ZeptoJS Detect Module
$.os
{android: true,phone: true ,tablet: false}
$.browser
{chrome:true,version:"56.0.2924.87",webkit:true}
四、ZeptoJS Event Module
on 綁定一個事件處理程序
off 解除綁定的事件處理程序
one 第一次事件觸發(fā)之后,將自動解除綁定
trigger 通過js的方式觸發(fā)指定的事件(多數(shù)都是自定義事件)
練習(xí):實現(xiàn)一個頁面,在該頁面中有2個按鈕,兩個按鈕的id分別btn1,btn2;
要求:
①點擊btn1,超過5次自動解除綁定
②點擊btn2,在第3次,觸發(fā)自定義的事件,彈窗顯示‘自定義事件被觸發(fā)了’
Zepto.js默認包含5個模塊
①zepto核心模塊;包含許多方法
②event通過on()& off()處理事件
③ajaxXMLHttpRequest 和 JSONP 實用功能
④form序列化 & 提交web表單
⑤ie增加支持桌面的Internet Explorer 10+和Windows Phone 8。
一、Zepto的常見模塊
1、core
$(''),支持常見的選擇器
$.each/map/grep/parseJson/camelCames/trim... 和數(shù)據(jù)操作相關(guān)的方法
insertAfter insertBefore append appendTo prepend prenpendTO
html/css/addClass/removeClass/width/height
remove
next/prev/parent/parents/children..
detect
$.os
$.browser
event
on
off
one
trigger
2、ajax模塊
$.ajax()
$.get()
$.param() 將一個對象進行表單序列化 (在angularJS時
提供了$httpParamSerializerJQLike(object))
$.post()
練習(xí):使用post請求,將{name:'zhangsan'}發(fā)給服務(wù)器端,服務(wù)器端接收到數(shù)據(jù),返回一個{tip:"Hello zhangSan"}.
通過Zepto中的$.post()來實現(xiàn)要求。
打開apache,請求注意端口號。
3、form模塊
serialize
serializeArray
submit
使用基本步驟:需要給表單元素指定name屬性。
注意事項:
如果表單元素中有復(fù)選、單選框,如果沒有選中的,默認在進行表單序列化時,是不會把它添加到字符串或者數(shù)組中的。
4、Touch模塊
//設(shè)置阻止掉默認的滑動效果
document.addEventListener(
'touchmove',
function (event) {
event.preventDefault();
},
{passive:false}
)
Touch模塊 給我們提供了兩大類事件的支持
①點按類
tap/longtap/doubletap
②滑動類
swipe/swipeLeft/swipeRight/swipeUp/swipeDown
如何使用事件呢?
①綁定對應(yīng)的事件
element.on('swipe',function(){})
②觸發(fā)事件
5、動畫模塊 (fx+fxmethods)
fxmethods:
fadeIn fadeOut fadeTo fadeToggle
show hide toggle
...
fx:
animate()
二、練習(xí)Zepto的使用。
1、實現(xiàn)一個網(wǎng)頁版的簡歷
1.1 向服務(wù)器端獲取數(shù)據(jù),將數(shù)據(jù)顯示在列表中。
①獲取數(shù)據(jù)
②找到列表,創(chuàng)建元素,插入到列表
1.2 向服務(wù)器端獲取數(shù)據(jù),將數(shù)據(jù)顯示在列表中。
①獲取數(shù)據(jù)
②找到id為skills的div,創(chuàng)建元素,插入到div
2、將pc端的項目移植到Mobile端。
2048實現(xiàn)混合編程的方式有很多種,phoneGap也是一種的常見的方式,它最大的特點是借助各種各樣的插件來實現(xiàn)對于設(shè)備底層的調(diào)用。
phoneGap與cordova的關(guān)系:
最早的時候,phoneGap是一個非常流行的框架,后來被Adobe收購了,PhoneGap依然了自己的商標(biāo)所有權(quán),將核心的跨平臺代碼共享給了Adobe,Adobe將核心代碼全部開源,形成的新的項目叫做cordova。
cordova是phoneGap的核心代碼
混合編程:
①將前端代碼拷貝到Android工程的assets
②將前端代碼部署在服務(wù)器,通過loadUrl載入服務(wù)器的url
一、PhoneGap的概述
https://phonegap.com/ phoneGap官網(wǎng)
http://cordova.apache.org/ cordova官網(wǎng)
https://build.phonegap.com/ phoneGap提供的云端打包網(wǎng)址
http://phonegap-plugins.com/ 第三方的基于phoneGap的插件的列表站點
what?是一個針對移動端的,旨在通過編寫前端代碼來實現(xiàn)開發(fā)跨平臺應(yīng)用程序的開發(fā)框架
之前通過eclipse創(chuàng)建Android項目,通過混合編程的方式來打包生成安裝文件(沒有辦法通過java來實現(xiàn)很多原生組件的調(diào)用,包括設(shè)備底層的調(diào)用)
*phoneGap提供了各種各樣的插件,這些插件給我們提供了js的接口來實現(xiàn)設(shè)備低層的調(diào)用。
理念:
實現(xiàn)write once,run everywhere.
where? 低成本的開發(fā)跨平臺應(yīng)用程序(Android/iOS/WP)
why?
①免費開源
②標(biāo)準(zhǔn)化 完全遵循w3c標(biāo)準(zhǔn)
③提供了非常方便的云端打包工具,可以直接將前端代碼打包生成可以安裝在移動端OS的app
④低成本 即使沒有學(xué)過專業(yè)的原生開發(fā)技能,也能夠基于前端技術(shù)以及phoneGap所提供的核心API來實現(xiàn)一個能夠調(diào)用底層硬件的app
ADB: Android Debug Bridge 安卓調(diào)試橋,之前在Android項目點擊run as去作為Android應(yīng)用去運行,背后就是靠ADB將生成的apk結(jié)尾的文件傳遞到模擬器中。
how?
方式1:
借助于phoneGap所建議的方式,通過兩個軟件,一個安裝在pc,一個安裝在mobile
①安裝pc端的軟件 phonegap-desktop
②安裝移動端的軟件
https://github.com/phonegap/phonegap-app-developer/tree/master/resources/release
adb install **.apk
2.1 windows+R->cmd
2.2
③
方式2:
通過命令行 :
//全局安裝cordova
npm install -g cordova
//創(chuàng)建一個基于cordova 的myApp項目
cordova create MyApp
//進入到MyApp的目錄
cd MyApp
//讓cordova支持Android開發(fā)平臺
cordova platform add android
//打包APK的安裝包,運行在對應(yīng)的Android設(shè)備
cordova run android
二、PhoneGap支持的事件
deviceready
pause/resume
online/offline
battery***
***button
綁定事件的方式:
document.addEventListener(
'deviceready',
function(){},
false
)
、實現(xiàn)功能
使用谷歌瀏覽器將網(wǎng)頁打包為可以在桌面直接打開的app,可以實現(xiàn)直接打開瀏覽器指定網(wǎng)頁,也可以隱藏菜單欄全屏打開網(wǎng)頁應(yīng)用。
二、適用范圍
需要直接在桌面打開的網(wǎng)頁應(yīng)用,但不需要客戶端或者硬件交互的場景。
三、操作步驟
1、安裝谷歌瀏覽器
2、打開指定的HTML網(wǎng)頁應(yīng)用
3、瀏覽器右上角的菜單,依次點擊“右上角菜單-更多工具-創(chuàng)建快捷方式-填寫應(yīng)用名稱”,此時會在桌面生成應(yīng)用圖標(biāo)。
4、打開桌面的應(yīng)用圖標(biāo),會直接使用谷歌瀏覽器打開網(wǎng)頁。
5、如果需要全屏展示,可在應(yīng)用圖標(biāo)“右鍵-屬性-目標(biāo)-增加 ‘-kiosk’ 參數(shù)”,打開即可全屏。
6、備注:如果直接創(chuàng)建谷歌瀏覽器的快捷方式,在“右鍵-屬性-目標(biāo)-增加 -kiosk和網(wǎng)站url”,也可實現(xiàn)相同效果。
從移動平臺崛起以來,HTML5移動應(yīng)用開發(fā)迅速變成了熱門話題,開發(fā)者們被各種開發(fā)HTML5移動應(yīng)用的方法搞得暈頭轉(zhuǎn)向,今天請到了金山云基礎(chǔ)架構(gòu)部研發(fā)負責(zé)人柴春燕給大家分享如何避免HTML5移動應(yīng)用最容易踩的那些坑。
柴春燕--
微軟社區(qū)精英計劃博客組負責(zé)人,HTML5研究小組成員,擅長HTML5及移動應(yīng)用開發(fā);
具有多年Web開發(fā)經(jīng)驗,曾參與開發(fā)微軟Visual Studio 2010中文學(xué)習(xí)平臺,基于SaaS模式的E-Learning系統(tǒng);
曾負責(zé)當(dāng)當(dāng)網(wǎng)Web前端開發(fā)及移動應(yīng)用開發(fā),擔(dān)任百度音樂高級研發(fā)工程師;
目前就職于金山云,初期負責(zé)金山云前端架構(gòu),現(xiàn)任基礎(chǔ)架構(gòu)部研發(fā)經(jīng)理。
01/移動應(yīng)用中HTML5的新特性
工欲善其事,必先利其器。我比較推崇的學(xué)習(xí)技術(shù)的方式,是先整體了解,然后結(jié)合實際需求,再做針對性的學(xué)習(xí)。整體了解的方式,比較建議是直接看官網(wǎng)的API文檔,這里可以推薦幾個網(wǎng)站: http://www.w3school.com.cn/html5/index.asp, https://developer.mozilla.org/zh-CN/docs/Web/Guide/HTML/HTML5, http://www.html5rocks.com, http://caniuse.com/
其中,特別說明下http://caniuse.com/,通過這個網(wǎng)站,我們可以非常快速的查詢到你所想使用的html5的特性在各個瀏覽器,包括不同終端的瀏覽器的兼容性情況。
HTML5 在移動應(yīng)用開發(fā)上面能夠利用的特性主要有:
1. form input type
表單是我們在開發(fā)中經(jīng)常會遇到的,如果按照傳統(tǒng)的方式,要介入jquery validate或者自己寫正則進行判斷,但是其實html5的form表單新增的input type屬性,能夠快速幫我們實現(xiàn)所需要的功能。
2. video & audio
移動瀏覽器是不支持flash的,在一些微信專題活動中,經(jīng)常會看到嵌入音頻,那么audio標(biāo)簽就是比較適合的應(yīng)用場景,html5中audio提供的api attr還是比較全面的。
視頻格式一般有mp4和webm兩種格式,在使用的時候,一般建議同時生成兩種,根據(jù)瀏覽器兼容性,進行相應(yīng)的選擇。音頻audio,一般會同時制作mp3 ogg格式。
3. storage
關(guān)于web storage,大家可以參考我之前分享的一篇內(nèi)容:
http://www.chaichunyan.com/topics/html5-training/5.html5_storage/#/
重點是localstorage,尤其是我們在做移動應(yīng)用的性能優(yōu)化時,localstorage能夠發(fā)揮很大的作用。
學(xué)習(xí)的時候,建議大家?guī)е鴨栴}去學(xué)習(xí),比方說“l(fā)ocalstorage最大的存儲容量是多少?”“有沒有有效期?”“cookie是有域的概念的,那么localstorage呢?”
4. css3
html5其實更多的是一個web標(biāo)準(zhǔn),這個標(biāo)準(zhǔn)里邊,包含了html、JavaScript api、css。css3是我們在移動應(yīng)用中要重點學(xué)習(xí)和掌握的。
1.選擇器
2.自定義字體
3.多欄布局
4.文字,容器陰影
5.圓角
6.漸變效果
7.動畫 ...
大家可以通過下面一個例子有一個直觀的印象:
http://www.chaichunyan.com/topics/html5-training/7.css3_summary/demos/index.html
之前很多我們需要通過js或者切圖實現(xiàn)的效果,在移動端,就可以直接通過css3實現(xiàn)。
這里特別強調(diào)下關(guān)于布局,css3彈性布局,希望大家能夠仔細去了解,我在面試時候,必問的一道題,當(dāng)然,面試只是手段,更重要的是希望能夠?qū)W以致用,真正在實際工作中發(fā)揮作用。
flexbox布局的兼容性,彈性盒模型實現(xiàn)的原理,這些我們在做移動終端調(diào)試時候,如果只是靠反復(fù)試錯,那么效率是非常低的。
了解了html5的特性,開發(fā)者就會在移動應(yīng)用上一展身手了。
02/HTML5移動應(yīng)用中踩過的那些坑
1.布局
移動瀏覽器訪問的web站點,后面稱為mobile webapp哈(泛指移動終端瀏覽器訪問的web站點),能不能使用傳統(tǒng)的流式布局?答案是可以,但是要慎用。
mobile webapp對css3的彈性布局支持還是比較給力的,iOS Safari還好,但是Android的碎片化非常嚴重,尤其是Android上面各種第三方瀏覽器會做各種各樣的定制化,使用flexbox比float能夠減少你在布局調(diào)試上的時間,而且兼容性有保證。
2.圖片適配
這里邊要提供一個概念,是屏幕分辨率和物理分辨率,為什么我們使用ios看到的圖片清晰度那么高,原因是普通的手機屏幕,一點顯示一個像素,但是iphone4s 以后是一個點四個像素。
那按照320的設(shè)計稿切出來的圖片,在iphone上面顯示肯定是有鋸齒的。
處理方法可以參見我之前分享的一篇文章:圖片的適配與清晰度
http://blog.csdn.net/spring21st/article/details/7513906
3.字體
我把字體的處理分為兩類,一種是藝術(shù)字體、icon,另一種是我們在頁面中的字體。
移動終端對網(wǎng)絡(luò)的要求是比較高的,我們要盡可能減少網(wǎng)絡(luò)請求,圖片是非常大的網(wǎng)絡(luò)開銷,當(dāng)然,我們可以用合并圖片的方式減少請求數(shù),但是請求量變大了。
css3支持web fonts,所以,我們可以引入字體文件,而不是所有的字體都是通過切圖的方式來實現(xiàn)。對于icon,一種方式是base64處理,但是現(xiàn)在更常見的做法,是轉(zhuǎn)換成矢量字體。
這里推薦一個網(wǎng)站:font awesome http://fortawesome.github.io/Font-Awesome/icon/css3/
這里邊涵蓋了大部分我們會用到的圖標(biāo),當(dāng)然,公司有精力和人力的情況下,建議可以維護自己的矢量字體庫。
4.橫豎屏
我們可以通過css 的media query 判斷橫豎屏。
但是這種只能控制樣式展現(xiàn),當(dāng)我們需要監(jiān)聽橫豎屏變化的時候,就只能通過js監(jiān)聽window.onorientationchange事件的方式實現(xiàn)。
但是,下面這種情況會讓你很無語:
那我們推薦下面這種實現(xiàn)方案:
相比較pc web,mobile webapp的調(diào)試更復(fù)雜,而且未知的問題更多,遇到問題,我們要有耐心去跟蹤定位,就像之前我們遇到iscroll性能問題、fast-click穿透的問題,都是一點一點排查處理的。
03/混合應(yīng)用(Hybrid)的注意事項
現(xiàn)在“快速迭代,敏捷開發(fā),低成本上線“基本上是每家公司都追求的目標(biāo),混合應(yīng)用就是在這種場景下應(yīng)運而生。
Hybrid App優(yōu)點眾多,Web前端工程師0成本介入,不依賴版本的實時更新,快速實現(xiàn)跨平臺需求,等等。但是,我對混合的看法是,根據(jù)實際情況合理使用,因地制宜。
那么什么樣的場景適合混合應(yīng)用開發(fā)?
1. 快速原型,驗證產(chǎn)品功能。我們之前開發(fā)過一個app,Android和iOS提供宿主環(huán)境,webview展現(xiàn)內(nèi)容都是通過html5實現(xiàn)的,半個月就開發(fā)上線了,較之傳統(tǒng)應(yīng)用開發(fā)人員成本和時間成本都縮短很多。
2. 內(nèi)容類的應(yīng)用,比如csdn的app,就是采用hbuilder混合方案實現(xiàn)的,對性能要求沒有那么高。
在考慮hybird的時候,要避免以下幾個誤區(qū):
(1)為了HTML 5而Hybrid App
html5只是技術(shù)實現(xiàn)手段而已,要根據(jù)公司的實際業(yè)務(wù)場景,以及人員配比,綜合考慮,不能因為react native比較火,就必須要在公司推行這種實現(xiàn)方案,我覺得為技術(shù)而技術(shù)是不可取的。
(2)忽略移動應(yīng)用中的關(guān)鍵因素
mobile webapp本質(zhì)上還是基于PC的一種開發(fā)模式,開發(fā)者使用PC瀏覽器模擬App中的webview進行調(diào)試。PC瀏覽器與手機webview的區(qū)別是巨大的,包括能支配的CPU資源,最大占有的內(nèi)存,運行的網(wǎng)絡(luò)環(huán)境,click和touch事件的區(qū)別,瀏覽器對CSS/JS的解析和對事件處理等等。
app工程師考慮比較多的內(nèi)存的問題,這些在web開發(fā)時候是很少考慮的。另外,就是網(wǎng)絡(luò)環(huán)境方面,雖然現(xiàn)在3g、4g覆蓋率越來越高,但是移動終端的訪問和pc還是有很大差距,wifi和蜂窩網(wǎng)絡(luò)的切換,基站變化等諸多因素都會導(dǎo)致網(wǎng)絡(luò)間歇性斷開,web開發(fā)對于這種不穩(wěn)定網(wǎng)絡(luò)環(huán)境問題的處理上都有所欠缺。
(3)交互體驗一致性
ios和Android的交互設(shè)計是兩套規(guī)范,雖然有相似的地方,但是從操作習(xí)慣上,就已經(jīng)決定了,我們想用一套交互設(shè)計,適配兩個平臺是很難的,包括包括視覺風(fēng)格,界面切換,操作習(xí)慣等。
Hybrid App方案是一把雙刃劍,一方面它平衡了Native App和Web頁面的優(yōu)缺點,一定程度上解決了Native App開發(fā)過程中迭代慢,版本依賴,Native開發(fā)資源不足的問題,但另一個方面過度依賴Hybrid方案會造成Web前端開發(fā)成本快速上升,甚至造成App整體體驗下降,甚至造成功能缺失。
回到最開始那句話”不要為了Hybrid而Hybrid“,根據(jù)實際場景,控制好方案中native和web的邊界。
04/Q&A
Q1:關(guān)于響應(yīng)式開發(fā)中對于手機屏幕高度的解決有沒有什么好的解決方案?
響應(yīng)式開發(fā)本質(zhì)上是移動設(shè)計優(yōu)先的一種開發(fā)方式,我沒太明白對于手機屏幕高度的解決,具體的問題是什么樣的,原則上高度是不需要做處理的,除非是你對首屏有要求。關(guān)于響應(yīng)式開發(fā),可以看看我這篇文章http://www.chaichunyan.com/index.php/2016/03/03/html5-wrd/
Q2:對首屏有要求的情況, 除了判斷高度還有沒有其他好的解決方案?如果是flex布局可以解決這個問題嗎?
問題的根本是獲取首屏的高度,(1)如果你是后端渲染的話,可以獲取機型和瀏覽器版本,拿到屏幕分辨率做適配 (2)根據(jù)屏幕寬度做適配,但是做不到完全絕對的首屏自適應(yīng),如果有更好的方案,我再跟大家分享。
Q3:hybrid開發(fā)中,h5頁面太多的話,會不會影響ios發(fā)布?
之前有ios對phonegap這種跨平臺的應(yīng)用審核是不通過,不過現(xiàn)在放開這個限制了。h5頁面過多,會影響應(yīng)用的性能和體驗,建議可以把h5打包放到ipk里邊,但是要做好靜態(tài)資源的版本管理。
Q4:css3 彈性布局中, 由于android碎片化嚴重的問題, 能不能有好的案例指導(dǎo)? 我們要求支持到android4以上版本。
真的要善用文檔和工具, http://caniuse.com/#search=flex, 我分享時候提到的這個網(wǎng)站,明確說明了flex兼容性。
如果是Android4.4以上機型,基本上可以放心使用,注意的地方有兩個:1. 要記得寫各個瀏覽器的css前綴 2. flex里邊可以嵌套flex.
Q5:hybird開發(fā)過程中, 原生代碼登錄權(quán)限問題,h5部分的頁面,如何共享登錄相關(guān)信息?
這要看你實現(xiàn)的方案,(1)嵌套靜態(tài)的h5頁面,那么需要native打開webview的時候,使用js briage調(diào)用頁面js的方法,寫入用戶信息,實現(xiàn)登錄共享 (2)如果打開的是動態(tài)渲染的頁面(如php輸出的頁面),那么可以在請求的url中攜帶用戶token,php通過query string判斷驗證,這個是native和webview數(shù)據(jù)交互的問題。
Q6:h5動畫在部分安卓webview中有時候會出現(xiàn)卡頓,這種情況改怎么優(yōu)化呢?
1. 可以做簡單的測試,看看瀏覽器支持的情況,如果瀏覽器支持不夠好,那么可能要做降級處理。
2. 減少動畫效果,因為動畫是要使用gpu渲染的,原生app能夠流暢,很大程度上是直接調(diào)用硬件處理的。
優(yōu)化的方案我這邊基本上是降級處理,Android低版本不支持的話,就使用基本動畫,比方不會使用3D翻轉(zhuǎn)。因為h5畢竟受限于webview環(huán)境,像jquery 和 zepto都提供對機型和瀏覽器的判斷。
Q7:在移動端瀏覽器上能支持h5離線存儲的性能嗎?
No problem.我們在實際項目中,優(yōu)化前端性能,曾經(jīng)用localstorage做靜態(tài)資源的版本管理和存儲。
更多技術(shù)干貨關(guān)注公眾號“極牛”。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。