1. 微信小程序JS為什么無(wú)法使用 document,window 等。
由于小程序開(kāi)發(fā)框架的邏輯層并非運(yùn)行在瀏覽器環(huán)境中,而是運(yùn)行在App Service Thread中,視圖層View運(yùn)行在View Thread,由Webview實(shí)現(xiàn)渲染,兩者之間通過(guò)JSBridge實(shí)現(xiàn)通信。

下圖說(shuō)明了 Page 實(shí)例的生命周期。

2. 為什么在微信開(kāi)發(fā)者工具中正常,但是在真機(jī)中調(diào)試卻異常,如樣式異常,es6語(yǔ)法報(bào)錯(cuò)?
首先,需要明確小程序目前可運(yùn)行于各不相同的三端:
-
在 iOS 上,小程序的 Javascript 代碼是運(yùn)行在 JavaScriptCore 中,視圖層是由 WKWebView 來(lái)渲染的,環(huán)境有 iOS8、iOS9、iOS10
-
在 Android 上,小程序的 javascript 代碼是通過(guò) X5 JSCore 來(lái)解析,視圖層是由 X5 基于 Mobile Chrome 37 內(nèi)核來(lái)渲染的
-
在 開(kāi)發(fā)工具上, 小程序的 javascript 代碼是運(yùn)行在 nwjs (U 升級(jí) nwjs 到 19.4 版本, 更新至 Chrome55 內(nèi)核)中,視圖層是由 Chrome Webview 來(lái)渲染的;
盡管三端的環(huán)境是十分相似的,但是還是有些許區(qū)別:
-
ES6 語(yǔ)法支持不一致 語(yǔ)法上開(kāi)發(fā)者可以通過(guò)開(kāi)啟 ES6 轉(zhuǎn) ES5 的功能來(lái)規(guī)避。
-
ES6 API 支持不一致 考慮到代碼包大小的限制,API 上目前需要開(kāi)發(fā)者自行引入相關(guān)的類庫(kù)來(lái)進(jìn)行處理,可以通過(guò) caniuse 或者 X5兼容 查詢到相關(guān) API 的支持情況
-
wxss 渲染表現(xiàn)不一致 盡管可以通過(guò)開(kāi)啟樣式補(bǔ)全來(lái)規(guī)避大部分的問(wèn)題,還是建議開(kāi)發(fā)者需要在 iOS 和 Android 上檢查小程序的真實(shí)表現(xiàn)。
運(yùn)行時(shí)環(huán)境的差異導(dǎo)致各種詭異的問(wèn)題,所以一切調(diào)試應(yīng)以真機(jī)為準(zhǔn);
3. 微信小程序的組件是否都是原生實(shí)現(xiàn)的,類似React Native?
No,小程序視圖層仍然依賴于Webview,只有部分組件是原生組件,用來(lái)解決Mobile Web體驗(yàn)問(wèn)題。目前原生組件包括:input,textarea,video,map,canvas
tip: input 組件是一個(gè) native 組件,字體是系統(tǒng)字體,所以無(wú)法設(shè)置 font-family;
tip: textarea 組件是由客戶端創(chuàng)建的原生組件,它的層級(jí)是最高的。
tip: video 組件是由客戶端創(chuàng)建的原生組件,它的層級(jí)是最高的。
tip: map 組件是由客戶端創(chuàng)建的原生組件,它的層級(jí)是最高的。
tip: canvas 組件是由客戶端創(chuàng)建的原生組件,它的層級(jí)是最高的。
而其它組件都是基于Web Component規(guī)范實(shí)現(xiàn)的Custom Element,而諸如picker彈出選擇器行為,navigator跳轉(zhuǎn)行為,都是基于微信原生提供的能力,理解為調(diào)用wx.xxxApi
4. 其他
-
小程序的背景圖片,暫時(shí)不支持本地圖片
-
小程序的showToast中的duration如果不設(shè)置,會(huì)有默認(rèn)秒數(shù),所以在做加載動(dòng)畫(huà)時(shí),最好設(shè)置一個(gè)較長(zhǎng)的時(shí)間,否則,如果加載時(shí)間過(guò)長(zhǎng),會(huì)在默認(rèn)秒數(shù)后動(dòng)畫(huà)就停止了
-
防止用戶重復(fù)提交時(shí),變量需要在onShow中設(shè)置為可操作,而不是onHide
控制臺(tái)常見(jiàn)的警告信息處理

意思很明顯,就是說(shuō),你在綁定數(shù)據(jù)數(shù)據(jù)時(shí)候,尤其在用wx:for循環(huán)時(shí),你可以給元素添加wx:key="屬性名",通過(guò)這種方式,來(lái)提高小程序的性能。?