可用性
調試
vConsole
在真機上,如果想要查看console API輸出的日誌內容和額外的調試資訊,按一下荧幕右上角的按鈕打開的選單裏選擇打開調試,此時小程序會退出,重新打開後會右下角會出現一個vConsole按鈕,按一下vConsole按鈕可以打開日誌面板。
小程序的vConsole展示內容如下:

vConsole 說明
由於實現機制的限制,開發者調用console API列印的日誌內容,是轉換成JSON字串後傳輸給vConsole的,導致vConsole中展示的內容會有一些限制:
- 除了Number、String、Boolean、null外,其他類型都會被作為Object處理展示,列印對象及原型鏈中的Enumerable内容。
- Infinity和NaN會顯示為null。
- undefined、ArrayBuffer、Function類型無法顯示。
- 無法列印存在迴圈引用的對象。
const a = {};
a.b = a;
console.log(a);針對上述問題,小程序在使用vConsole時做了一些處理:
const circular = { x: {}, c: {} };
circular.x = [{ promise: Promise.resolve() }];
circular.a = circular;
circular.c.x0 = circular.x[0];
console.log(circular);
// "{a: '<Circular: @>', c: {x0: '<Circular: @.x[0]>'}, x: [{promise: '<Promise>'}]}"TIP
儘量避免在非調試情景下列印結構過於複雜或內容過長的日誌內容,可能會帶來額外耗時。
運行環境
小程序運行環境
小程序運行在三端:iOS(iPhone/iPad)、Android和用於調試的開發者工具。
三端的腳本執行環境以及用於渲染非原生組件的環境是各不相同:
- 在iOS上,小程序邏輯層的javascript代碼運行在JavaScriptCore中,視圖層是由WKWebView來渲染的,環境有iOS8、 iOS9、iOS10。
- 在Android上,小程序邏輯層的javascript代碼運行中X5 JSCore中,視圖層基於Mobile Chrome 97內核實現了。 同層渲染 的功能。
- 在開發工具上,小程序邏輯層的javascript代碼是運行在 NW.js 中,視圖層是由Chromium 60 Webview來渲染的。
運行限制
基於安全考慮,小程序中不支持動態執行JS代碼,即:
不支持使用eval執行JS代碼。
不支持使用new Function創建函數。
平臺差异
儘管三端的環境是十分相似的,但是還是有些許區別:
- JavaScript語法和API支持不一致:語法上開發者可以通過開啟ES6轉ES5的功能來規避; 此外,小程序基礎庫內寘了必要的Polyfill,來彌補API的差异。
- WXSS渲染表現不一致:儘管可以通過開啟樣式補全來規避大部分的問題,還是建議開發者需要在iOS和Android上分別檢查小程序的真實表現。
TIP
開發者工具僅供調試使用,最終的表現以用戶端為准。
用戶端ES6 API支持情况
TIP
以下表格中√為支持,×為該項不支持。
| String | iOS 8 | iOS9 | iOS10 | Android |
|---|---|---|---|---|
| codePointAt | √ | √ | √ | √ |
| normalize | × | × | √ | √ |
| includes | √ | √ | √ | √ |
| startsWith | √ | √ | √ | √ |
| endsWith | √ | √ | √ | √ |
| repeat | √ | √ | √ | √ |
| String.fromCodePoint | √ | √ | √ | √ |
| Array | iOS 8 | iOS9 | iOS10 | Android |
|---|---|---|---|---|
| copyWithin | √ | √ | √ | √ |
| find | √ | √ | √ | √ |
| findIndex | √ | √ | √ | √ |
| fill | √ | √ | √ | √ |
| entries | √ | √ | √ | √ |
| keys | √ | √ | √ | √ |
| values | X | √ | √ | X |
| includes | X | √ | √ | √ |
| Array.from | √ | √ | √ | √ |
| Array.of | √ | √ | √ | √ |
| Number | iOS 8 | iOS9 | iOS10 | Android |
|---|---|---|---|---|
| isFinite | √ | √ | √ | √ |
| isNaN | √ | √ | √ | √ |
| parseInt | √ | √ | √ | √ |
| parseFloat | √ | √ | √ | √ |
| isInteger | √ | √ | √ | √ |
| EPSILON | √ | √ | √ | √ |
| isSafeInteger | √ | √ | √ | √ |
| Math | iOS 8 | iOS9 | iOS10 | Android |
|---|---|---|---|---|
| trunc | √ | √ | √ | √ |
| sign | √ | √ | √ | √ |
| cbrt | √ | √ | √ | √ |
| clz32 | √ | √ | √ | √ |
| imul | √ | √ | √ | √ |
| fround | √ | √ | √ | √ |
| hypot | √ | √ | √ | √ |
| expm1 | √ | √ | √ | √ |
| log1p | √ | √ | √ | √ |
| log10 | √ | √ | √ | √ |
| log2 | √ | √ | √ | √ |
| sinh | √ | √ | √ | √ |
| cosh | √ | √ | √ | √ |
| tanh | √ | √ | √ | √ |
| asinh | √ | √ | √ | √ |
| acosh | √ | √ | √ | √ |
| atanh | √ | √ | √ | √ |
| Object | iOS 8 | iOS9 | iOS10 | Android |
|---|---|---|---|---|
| is | √ | √ | √ | √ |
| getOwnPropertyDescriptor | √ | √ | √ | √ |
| keys | √ | √ | √ | √ |
| getOwnPropertyNames | √ | √ | √ | √ |
| getOwnPropertySymbols | √ | √ | √ | √ |
| Other | iOS 8 | iOS9 | iOS10 | Android |
|---|---|---|---|---|
| Symbol | √ | √ | √ | √ |
| Set | √ | √ | √ | √ |
| Map | √ | √ | √ | √ |
| Proxy | × | × | √ | X |
| Reflect | √ | √ | √ | √ |
| Promise | √ | √ | √ | √ |
運行機制
小程序啟動會有兩種情况,一種是冷開機,一種是暖開機,假如用戶已經打開過某小程序,然後在一定時間內再次打開該小程序,此時無需重新啟動,只需將後臺態的小程序切換到前臺,這個過程就是暖開機; 冷開機指的是用戶首次打開或小程序被宿主App主動銷毀後再次打開的情况,此時小程序需要重新加載啟動。
更新機制
小程序冷開機時如果發現有新版本,將會非同步下載新版本的代碼包,並同時用用戶端本地的包進行啟動,即新版本的小程序需要等下一次冷開機才會應用上。 如果需要馬上應用最新版本,可以使用 wx.getUpdateManager API進行處理。
運行機制
小程序沒有重啓的概念。
當小程序進入後臺,用戶端會維持一段時間的運行狀態,超過一定時間後(現時是5分鐘)會被容器主動銷毀。
在iOS上,當用戶端在一定時間間隔內(現時是5秒)連續收到兩次及以上系統記憶體告警時,會主動進行小程序的銷毀,並提示用戶。