2016移動前端調(diào)試漫游

如今在移動平臺上,web/hybrid app 不斷向 native app 發(fā)起挑戰(zhàn)非洲。

背景

出于解放生產(chǎn)力和降低成本的考量,越來越多的團隊開始嘗試以 web 技術(shù)來開發(fā)應(yīng)用。

在各移動平臺上拐纱,native app 開發(fā)都得到了官方的最大支持,工具鏈非常成熟地来。盡管如此戳玫,native app 開發(fā)者往往都不喜歡真機調(diào)試,因為它非常費時未斑。在 webapp 開發(fā)這邊咕宿,情況更加糟糕。不僅費時蜡秽,由于 webapp 往往要覆蓋多個平臺府阀,需要在多種設(shè)備上進行調(diào)試,這還讓調(diào)試工作變得非常地瑣碎芽突,難以形成通用的方案试浙。

前端開發(fā)者在 PC 平臺上如魚得水,然而切換到移動平臺寞蚌,則受到掣肘田巴。本文嘗試總結(jié)一些簡單有效的調(diào)試方案,以滿足不同場景下調(diào)試的需求挟秤。

縮小調(diào)試范圍

筆者認(rèn)為移動設(shè)備上調(diào)試的需求主要來自于兩點壹哺,一是 webapp 使用了(或需要適配)移動平臺上獨有的特性,例如觸摸事件艘刚、虛擬鍵盤遮蓋管宵、移動平臺獨有的 BOM API 等,二是 webapp 出現(xiàn) PC 瀏覽器上不可復(fù)現(xiàn)的錯誤。對于前者箩朴,我們似乎是只能迎難而上岗喉,但對于后者,則可以盡量避免炸庞。

出現(xiàn)在 PC 上不可復(fù)現(xiàn)的錯誤的主要原因是瀏覽器的兼容性問題钱床,其中渲染的問題更加突出。得益于 JavaScript 的語言特性和 ES5 廣泛實現(xiàn)燕雁,借助 babel 等工具诞丽,我們可以將由 ES6 ES7 語法編寫的代碼編譯為 ES5 的,從而避免 JavaScript 上的兼容性問題拐格。

(ES5 support table (來自于 caniuse))


不過 CSS 很難甚至是不能被通過打補蹲惫弧(polyfill)和編譯的方式來達到完美的兼容性嫡秕。開發(fā)者要對各目標(biāo)平臺的 CSS 支持度充分了解谆膳,從中選取廣泛支持的特性來進行開發(fā)华坦。好在 WebKit 以及衍生品已占據(jù)了移動瀏覽器渲染引擎(WebKit 包括用于布局渲染的 WebCore 和執(zhí)行 JavaScript 的 JavaScriptCore 兩個引擎,本文只取其渲染引擎的含義)的主要份額金踪,使 CSS 特性確定的工作減輕不少浊洞。

主要的移動平臺

不可否認(rèn),現(xiàn)如今 iOS 和 Android 系統(tǒng)統(tǒng)治了智能手機和平板電腦設(shè)備胡岔,本文所介紹的調(diào)試方法也僅針對于這兩個系統(tǒng)法希。iOS 上,瀏覽器核心隨系統(tǒng)一直平滑穩(wěn)定地升級靶瘸,iOS 6 以后支持使用 Mac Safari 來進行調(diào)試苫亦。Android 從 4.4 開始,其 WebView 基于 Chromium 開發(fā)怨咪,這不僅帶來了 v8 JavaScript 引擎屋剑,還帶來了可用桌面 Chrome 來調(diào)試的能力。

除此之外诗眨,微信的巨大成功唉匾,也讓針對于微信的 webapp 開發(fā)備受重視。在 iOS 上匠楚,微信瀏覽器與 Safari 表現(xiàn)一致巍膘。在 Android 上,它采用的是騰訊瀏覽服務(wù)(TBS)芋簿,并非系統(tǒng)提供的 WebView 組件峡懈。TBS 的初衷也許是解決在官方版本和衍生版本眾多的 Android 系統(tǒng)上,WebView 表現(xiàn)一致性的問題益咬。由于不隨 Android 系統(tǒng)一起升級,在很長一段時間里,TBS 的 Webkit 版本都落后于系統(tǒng)的 WebView幽告,導(dǎo)致微信常被調(diào)侃為“移動端的IE 6”梅鹦。好在今年 3 月基于 Blink 打造的 TBS 2.0 終于發(fā)布,使其支持更新的 CSS 特性冗锁。

(渲染引擎和一些 CSS 特性的支持情況(iOS8 搭載 Webkit2 出自 http://asciiwwdc.com/2014/sessions/206))


調(diào)試工具

本文僅介紹可以免費下載和使用的工具齐唆。

(調(diào)試工具總覽)


1、weinre 與 jsconsole

weinre (WEb INspector REmote) 與 jsconsole 是原理上相似的工具冻河。weinre 復(fù)用了 WebKit 的 Web Inspector 的界面代碼箍邮,有 Safari 和 Chrome 調(diào)試器經(jīng)驗的開發(fā)者會對此非常熟悉。jsconsole 是一個 JavaScript 的 web 控制臺叨叙,它能接管控制臺的日志輸出锭弊,也能響應(yīng)調(diào)試服務(wù)器發(fā)出的求值命令(通過 Server-Send Event 發(fā)出),將日志和求值結(jié)果通過 xhr 發(fā)送到服務(wù)器擂错。jsconsole 功能雖然更少味滞,但官方提供了一個開箱即用的線上應(yīng)用,http://jsconsole.com/钮呀,無需安裝任何軟件即可開始調(diào)試剑鞍。兩者的調(diào)試功能都是由 JavaScript 編寫,都必須把調(diào)試服務(wù)腳本插入目標(biāo)頁面爽醋,使其難以用于線上產(chǎn)品的調(diào)試蚁署。并且由于運行在瀏覽器沙盒中,其提供調(diào)試能力受到了較大的限制蚂四,例如無法查看 httponly 屬性的 cookie光戈,和非 xhr 的請求。

2证杭、微信 Web 調(diào)試工具與 spy-debugger

這兩者也是類似的工具田度,都是基于 weinre 開發(fā)的。設(shè)備連接調(diào)試工具提供的代理后訪問目標(biāo)網(wǎng)頁解愤,weinre 的調(diào)試腳本會被自動注入到 HTML 頁面镇饺,從而免除了手動注入的麻煩。相比于 weinre 僅能查看 HTTP xhr 請求送讲,利用代理奸笤,微信 Web 調(diào)試工具提供了查看所有 HTTP 請求的能力。不過由于沒有實現(xiàn) HTTPS 中間人哼鬓,無法查看 HTTPS 請求监右。 spy-debugger 在這些功能之上提供了查看 HTTPS 請求的功能。值得一提的是异希,微信 Web 調(diào)試工具額外提供了調(diào)試微信 JSSDK 的能力健盒,不過調(diào)試對象并不是真機,需是其提供的瀏覽器窗口。

3扣癣、Safari 與 Chrome

使用 PC 瀏覽器來調(diào)試對應(yīng)的移動瀏覽器惰帽,你將擁有最佳的調(diào)試體驗。WebKit 家族的 PC 瀏覽器都有非常強大的調(diào)試工具父虑,其調(diào)試移動設(shè)備的體驗幾乎與調(diào)試桌面網(wǎng)頁無異该酗。Opera 自從將渲染核心從 Presto 切換到 Blink 之后,自家用于調(diào)試 Opera Mobile 的 Dragonfly 也被移除了士嚎,可見 Opera 對 Webkit 調(diào)試工具也是滿意的(汗)呜魄。

Mac Safari 調(diào)試 iOS Safari 和 UIWebView 只需經(jīng)過簡單的設(shè)置。首先在 iOS 設(shè)備上啟用 Safari 的 Web 檢查器功能(設(shè)置>Safari>高級>Web 檢查器)莱衩,再通過 USB 線纜連接到 Mac爵嗅,然后就能在 Mac Safari 的“開發(fā)”菜單中選中該設(shè)備來進行調(diào)試。如果沒有找到“開發(fā)”菜單膳殷,則需要在 Safari 偏好設(shè)置中啟用調(diào)試功能操骡。調(diào)試 UIWebView 的步驟是一樣的,但是要求 app 在該 Mac 設(shè)備上能被調(diào)試赚窃,也就是說第三方開發(fā)者是不能直接調(diào)試微信的 UIWebView 的册招。

(Mac Safari 調(diào)試 iOS Safari)

Chrome 調(diào)試 Chrome for Android 和基于 Chromium 的 WebView 的詳情可以在https://developers.google.com/web/tools/chrome-devtools/debug/remote-debugging/remote-debugging找到。值得一提的是勒极,Chrome 調(diào)試支持 Screencast 功能是掰,能夠?qū)⒁苿釉O(shè)備上的 Web 視圖投射到 Chrome 調(diào)試工具中,不過這回降低 webapp 的性能表現(xiàn)辱匿。

(Chrome 調(diào)試 Chrome for Android)

使用 Chrome 來調(diào)試 iOS 設(shè)備也是可行的键痛。利用 google 開發(fā)的 ios-webkit-debug-proxy,把 Safari 的遠(yuǎn)程調(diào)試協(xié)議代理到 Chrome DevTools 上匾七,可以由 DevTools 接管幾乎所有的調(diào)試功能絮短。

(Chrome 調(diào)試 iOS Safari)


Webkit 遠(yuǎn)程調(diào)試協(xié)議

Webkit

Safari 和 Chrome 在移動平臺上強大的調(diào)試能力源自 Webkit 的遠(yuǎn)程調(diào)試協(xié)議(remote debugging protocol)。Webkit 的遠(yuǎn)程調(diào)試協(xié)議是 Webkit 在 2012 年引入的昨忆,目前所有 Webkit 內(nèi)核的瀏覽器都支持這一特性丁频。DevTools 通過遠(yuǎn)程調(diào)試協(xié)議與目標(biāo)頁面相連,可以獲取到 Webkit 內(nèi)核提供的調(diào)試信息邑贴,這些信息遠(yuǎn)比 weinre 等在瀏覽器沙盒中獲取的要準(zhǔn)確和豐富席里。Webkit 遠(yuǎn)程調(diào)試協(xié)議與 Chrome DevTools 都是開放的,這讓 ios-webkit-debug-proxy拢驾, React DevTools 和 vue-devtools 等強大且富有想象力的調(diào)試工具能成為現(xiàn)實奖磁。得益于協(xié)議的開放性,其他廠商也對 Webkit 調(diào)試表現(xiàn)出積極的興趣繁疤。Firefox 宣布了用于調(diào)試 Webkit 內(nèi)核瀏覽器的 Valence咖为,不過目前仍處于技術(shù)預(yù)覽版秕狰。

Fiddler

Fiddler 是可以運行在 Mac,Linux 和 Windows 上的一個用于 web 調(diào)試的代理軟件躁染》馇。可以用來查看 HTTP API 訪問,AMD 腳本加載褐啡,緩存命中等。Fiddler 有豐富的調(diào)試功能鳖昌,其中支持 HTTPS 捕獲和篡改請求響應(yīng)對移動端調(diào)試十分有用备畦。

使用 HTTPS 捕獲功能需要在移動設(shè)備上安裝 Fiddler 提供的證書,各移動平臺的設(shè)置方法可在http://docs.telerik.com/fiddler/configure-fiddler/tasks/configurefiddler找到许昨。有時我們需要替換線上產(chǎn)品的某個 js 文件來定位問題懂盐,或者偽造 session 來模擬使用場景,F(xiàn)iddler 的篡改功能就能派上用場糕档,具體的使用細(xì)節(jié)可以在http://docs.telerik.com/fiddler/KnowledgeBase/FiddlerScript/ModifyRequestOrResponse找到莉恼。

結(jié)論

調(diào)試運行 iOS >= 6 和 Android >= 4.4 的設(shè)備,優(yōu)先采用 Safari 或 Chrome 進行調(diào)試速那。其余情況俐银,可采用 weinre 及其衍生工具和 jsconsole。Fiddler 可作為這些方案的有效補充端仰。

參考資料:

http://javascript.ruanyifeng.com/bom/mobile.html

https://developer.chrome.com/multidevice/webview/overview

http://bbs.mb.qq.com/thread-1128359-1-1.html

https://github.com/wuchangming/spy-debugger

https://github.com/google/ios-webkit-debug-proxy

http://people.apache.org/~pmuellr/weinre/docs/latest/Home.html

https://developers.google.com/web/tools/chrome-devtools/debug/remote-debugging/remote-debugging

http://docs.telerik.com/fiddler/configure-fiddler/tasks/configurefiddler

http://docs.telerik.com/fiddler/KnowledgeBase/FiddlerScript/ModifyRequestOrResponse

http://taobaofed.org/blog/2015/11/20/webkit-remote-debug-test/

https://trac.webkit.org/wiki/WebInspector

https://facebook.github.io/react/blog/2014/01/02/react-chrome-developer-tools.html

https://github.com/vuejs/vue-devtools

https://developer.mozilla.org/en-US/docs/Tools/Valence

http://moduscreate.com/enable-remote-web-inspector-in-ios-6/

本文作者:陳倬(點融黑幫)捶惜,目前就職于點融網(wǎng)成都前端團隊,主要負(fù)責(zé)內(nèi)部 webapp 的開發(fā)荔烧,喜歡 Vue.js 吱七。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹤竭,隨后出現(xiàn)的幾起案子踊餐,更是在濱河造成了極大的恐慌,老刑警劉巖臀稚,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吝岭,死亡現(xiàn)場離奇詭異,居然都是意外死亡烁涌,警方通過查閱死者的電腦和手機苍碟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撮执,“玉大人微峰,你說我怎么就攤上這事∈闱” “怎么了蜓肆?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵颜凯,是天一觀的道長。 經(jīng)常有香客問我仗扬,道長症概,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任早芭,我火速辦了婚禮彼城,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘退个。我一直安慰自己募壕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布语盈。 她就那樣靜靜地躺著舱馅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刀荒。 梳的紋絲不亂的頭發(fā)上代嗤,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音缠借,去河邊找鬼干毅。 笑死,一個胖子當(dāng)著我的面吹牛泼返,可吹牛的內(nèi)容都是我干的溶锭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼符隙,長吁一口氣:“原來是場噩夢啊……” “哼趴捅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霹疫,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拱绑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丽蝎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猎拨,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年屠阻,在試婚紗的時候發(fā)現(xiàn)自己被綠了红省。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡国觉,死狀恐怖吧恃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麻诀,我是刑警寧澤痕寓,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布傲醉,位于F島的核電站,受9級特大地震影響呻率,放射性物質(zhì)發(fā)生泄漏硬毕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一礼仗、第九天 我趴在偏房一處隱蔽的房頂上張望吐咳。 院中可真熱鬧,春花似錦元践、人聲如沸挪丢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惠啄,卻和暖如春慎恒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撵渡。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工融柬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趋距。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓粒氧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親节腐。 傳聞我的和親對象是個殘疾皇子外盯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 大部分的后端會很很鄙視前端。我也不知道為什么翼雀,可能大部分人都會覺得腳本語言根本不算語言饱苟。 大多人 會叫我們切圖仔,...
    小黑的眼閱讀 3,307評論 0 15
  • 大家好狼渊,我叫馬駿茹箱熬,今天我來給大家演講的題目是我的妹妹。我有一個妹妹狈邑,她長著水靈靈的大眼睛尖銳的耳朵和靈敏的鼻子城须,...
    馬駿茹閱讀 246評論 0 0
  • 1. File -> Build Settings... 2. 添加場景以及選擇平臺 3. 點擊Player Se...
    星空夢想閱讀 1,289評論 1 1
  • 童話的結(jié)尾從來都是“王子和公主從此幸福地生活在了一起”糕伐。作者不會再寫多余的筆墨,聽故事的人也不會主動去想王子和公主...
    筑夢小兵閱讀 2,064評論 4 6
  • 在翔云小區(qū)蘸嘶,韓姨是一個知名人物赤炒。今年七十二歲的她氯析,被大家稱作“老改隊長”。因為整個小區(qū)的人莺褒,幾乎都找她改過衣服掩缓。 ...
    命自我立閱讀 667評論 12 16