一種ReactNative Android、IOS、Web融合的路由生成引擎

現有技術及問題

現有技術例如ReactWeb只能完成ReactNative(類原生)到Web js的頁面轉換,無法解決ReactNative上工作的頁面跳轉,到Web上的頁面跳轉的轉換。
問題是在於ReactNative的頁面跳轉是調用原生方案實現的,也就是在內存裏有一個頁面棧結構,用戶按返回可以實現銷燬當前頁面棧,退回之前的棧頂。
而Web方案是在瀏覽器上,瀏覽器是無狀態的,不會保存上一個頁面。
所以ReactNative ios、android和web的路由方案需要重新設計。

Web js技術路由方案介紹

先說一下Web js的路由跳轉
實現的簡要原理,以 hash 形式(也可以使用 History API 來處理)爲例,當 url 的 hash 發生變化時,觸發 hashchange 註冊的回調,回調中去進行不同的操作,進行不同的內容的展示。直接看代碼或許更直觀。

function Router() {
    this.routes = {};
    this.currentUrl = '';
}
Router.prototype.route = function(path, callback) {
    this.routes[path] = callback || function(){};
};
Router.prototype.refresh = function() {
    this.currentUrl = location.hash.slice(1) || '/';
    this.routes[this.currentUrl]();
};
Router.prototype.init = function() {
    window.addEventListener('load', this.refresh.bind(this), false);
    window.addEventListener('hashchange', this.refresh.bind(this), false);
}
window.Router = new Router();
window.Router.init();

上面路由系統 Router 對象實現,主要提供三個方法
init 監聽瀏覽器 url hash 更新事件
route 存儲路由更新時的回調到回調數組routes中,回調函數將負責對頁面的更新
refresh 執行當前url對應的回調函數,更新頁面。
其實簡單來說,就是頁面跳轉的時候,頁面名稱拿到,這個時候瀏覽器會監聽到頁面變化,此時重載跳轉方法,將頁面名稱對應的頁面實際業務,顯示出來。

但是ReactNative(可以在ios、android系統上運行)技術的App很大程度是基於原生Api開發的,在Android、Ios頁面裏,一個個頁面是以一個棧的形式存儲的。沒有所謂的頁面跳轉重載監聽方法。

在這裏,我們實現一套理論上通用的Web、ReactNative路由方案。

通用路由引擎

本方案的前提是ReactNative的代碼是由Web js轉換過來的,具體轉換技術參考ReactWeb的實現,是已有技術。
設計一個Router對象,並且App內維護一個key、value鍵值對的對象。
分別對應於
頁面模塊的名稱——僞鏈接
module1 —— url1
module2 ——-url2
module3 ——-url3
… ——-…

Web js,是通過url1,url2,url3註冊到Web js路由方案的Routers對象裏,點擊跳轉時,Routers拿到要跳轉的url,通過web瀏覽器引擎調用這個url,就會呈現新的頁面。
但是ReactNative方案,url1,url2,url3,點擊本身是無響應的,因爲只有在有web瀏覽器引擎的時候,纔會相應url點擊跳轉。
那麼我們通過以下引擎來實現url到業務模塊的跳轉。

這裏寫圖片描述

ReactNative頁面還是有一個Routers對象,而且所有的頁面也是和Web類似url綁定的,ReactWeb項目轉換後的ReactNative代碼,裏面的路由方案還是url跳轉,但是本身在ReactNative上是不工作的,例如這個方法點擊跳轉gourl,但gourl不工作,
我們可以在gourl這個方法里加入一個鉤子函數,hook住,做以下處理,
啓動手機本身的瀏覽器引擎,瀏覽器拿到新的url,就會響應加載新的url的事件,
我們可以在web瀏覽器引擎的shouldoverrideurl函數裏(加載url的回調函數,web瀏覽器引擎自帶),實現url->頁面名稱的轉換,並且通過ReactNative的startnewpage類似的方法,加載新的ReactNative頁面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章