您好,登錄后才能下訂單哦!
這篇文章主要講解了“wepy運行原理是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“wepy運行原理是什么”吧!
分析源碼之前,我們先來回顧一下,wepy 的使用:
<!-- 小程序入口 app.wpy --> <script> import wepy from 'wepy'; export default class extends wepy.app { ...... } </script>
讓我們一起看看 export 出來的 class,是怎么轉換成小程序語言的。
在《深入wepy源碼:wpy文件編譯過程》中,我們介紹了 wepy-cli 是如何編譯 wpy 文件的,里面有說到,complie-script.js 在處理 script 代碼時,會加入 wepy 初始化的代碼。編譯之后 dist 目錄下的文件,如下:
// dist/app.js App(require('./npm/wepy/lib/wepy.js').default.$createApp(_default, {})); // dist/pages/index.js Page(require('./../npm/wepy/lib/wepy.js').default.$createPage(Index , 'pages/index'));
可以看出,主要調用了 $createApp 和 $createPage 方法。在看這兩個方法之前,我們先來看一下 wepy 的目錄結構,以便后面的分析更好理解。
├─wepy ├─src ├─app.js 全局app邏輯,請求優化、promisify API、攔截器功能等 ├─base.js 定義了 $createApp 和 $createPage 等方法 ├─component.js 組件邏輯,臟值檢查、組件通信等 ├─event.js 事件方法 ├─mixin.js 混合方法 ├─native.js 空,代碼里用于app.js中重新定義wx接口 ├─page.js 繼承component,page的一些優化 ├─util.js 工具方法 ├─wepy.js 入口文件 ├─test ├─...
// dist/app.js App(require('./npm/wepy/lib/wepy.js').default.$createApp(_default, {}));
$createApp() 返回了一個類型為 object 的 config,里面包含了 ['onLaunch', 'onShow', 'onHide', 'onError'] 這些方法。
還執行了 $initAPI(),主要利用 Object.defineProperty 的 get 方法,將返回封裝為 promise,這里也是 API 實現 promise 寫法的核心。
// dist/pages/index.js Page(require('./../npm/wepy/lib/wepy.js').default.$createPage(Index , 'pages/index'));
$createPage() 和 $createApp() 類似,只不過是返回的是 Page 的方法,此外,還在生命周期中,添加了數據臟值檢查 $apply()。
wepy 使用臟數據檢查對原生小程序 setData 進行封裝,在函數運行周期結束時執行臟數據檢查。如果在異步函數中更新數據時,則需要手動執行 $apply()。
在 $createPage() 中,會在生命周期中調用 $apply(),來看一下它的定義:
$apply (fn) { if (typeof(fn) === 'function') { fn.call(this); this.$apply(); } else { if (this.$$phase) { this.$$phase = '$apply'; } else { this.$digest(); } } }
$$phase 標識是否有 臟數據檢查 在運行,如果沒有,則執行 $digest()。
$digest() { let k; let originData = this.$data; this.$$phase = '$digest'; this.$$dc = 0; while (this.$$phase) { this.$$dc++; if (this.$$dc >= 3) { throw new Error('Can not call $apply in $apply process'); } ...... this.$$phase = (this.$$phase === '$apply') ? '$digest' : false; } }
$digest() 執行時,主要是遍歷 originData,將 originData[k] 和 this[k] 做對比,如果不一樣,放到 readyToSet中,在循環之后,統一執行 setData 方法。
最后,在檢查 $$phase 是否有被設置為 '$apply',如果是,則再做一次臟數據檢查。
感謝各位的閱讀,以上就是“wepy運行原理是什么”的內容了,經過本文的學習后,相信大家對wepy運行原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。