商城系統(tǒng) 注冊

小程序 App() 和 Page() 函數(shù)調用時的初始化流程

2018-06-27|HiShop
導讀:內部實現(xiàn) 在__appServiceEngine__對象中,對App和getApp屬性的定義如下: // 其中的 t 就是 __appServiceEngine__ 對象var i = n(17);Object.defineProperty(t, App, { enumerable: !0, g...

內部實現(xiàn)

在 __appServiceEngine__ 對象中,對 App 和 getApp 屬性的定義如下:

// 其中的 t 就是 __appServiceEngine__ 對象
var i = n(17);
Object.defineProperty(t, "App", {
  enumerable: !0,
  get: function() {
      return i.appHolder
  }
}),
Object.defineProperty(t, "getApp", {
  enumerable: !0,
  get: function() {
      return i.getApp
  }
}),

而這兩個屬性對應的實現(xiàn)分別為 appHolder() 和 getApp() 方法,定義如下:

l = void 0,

t.appHolder = (0, i.surroundByTryCatch)(function(e) {
   l = new y(e)
}, "create app instance"),

t.getApp = function() {
   return l
},

由上可知,在 appHolder() 方法中,把外部傳入的 object 對象傳給 y(...) 方法進行初始化一個小程序實例對象,并把結果賦給變量 l 緩存起來,而在 getApp() 方法中則直接 return l,返回當前小程序對象。

App 實例初始化流程

在上述 page-frame.html 中,我們知道,在 app.js 被加載完后,小程序框架會立即執(zhí)行 require('app.js') 進行注冊小程序實例,即對 App() 函數(shù)進行調用(開發(fā)者已經(jīng)在 app.js 中定義好了入?yún)ο螅?,如下?/p>

<script src="./app.js"></script>
<script>require("app.js")</script>

在 App() 函數(shù)中,最終會調用 y(...) 方法進行初始化,其中 y(...) 的定義比較長,我們這里不再貼出代碼,詳情請自行查閱 WAService.js ,它的處理流程如下:

Page() 和 getCurrentPages() 函數(shù)

根據(jù) 文檔 , Page() 函數(shù)用來注冊一個頁面,接收一個 object 對象參數(shù),其指定頁面的初始數(shù)據(jù)、生命周期函數(shù)、事件處理函數(shù)等。 Page() 函數(shù)的聲明如下:

function Page(page: PageOptions): void

對于入?yún)?nbsp;object 對象(PageOptions)的屬性說明如下:

 小程序 App() 和 Page() 函數(shù)調用時的初始化流程

此外, getCurrentPages() 函數(shù)用于獲取當前頁面棧的實例,以數(shù)組形式按棧的順序給出,第一個元素為首頁,最后一個元素為當前頁面。它的聲明如下:

function getCurrentPages(): object[]

內部實現(xiàn)

同樣地,在 __appServiceEngine__ 對象中,對 Page 和 getCurrentPages 屬性的定義如下:

var r = n(2);
Object.defineProperty(t, "Page", {
  enumerable: !0,
  get: function() {
      return r.pageHolder
  }
}),
Object.defineProperty(t, "getCurrentPages", {
  enumerable: !0,
  get: function() {
      return r.getCurrentPages
  }
}),

而這兩個屬性對應的實現(xiàn)分別為 pageHolder() 和 getCurrentPages() 方法,定義如下:

var k = void 0, // 保存當前顯示的頁面(棧頂)
x = [], // 保存已加載過的頁面歷史棧數(shù)組

// 其中的 t 就是 __appServiceEngine__ 對象

t.getCurrentPage = function() {
    return k
},
t.getCurrentPages = function() {
    var e = [];
    return x.forEach(function(t) {
        e.push(t.page)
    }),
    e
},

M = {}, // 緩存所有已經(jīng)注冊的頁面

t.pageHolder = function(e) {
   if (!__wxRouteBegin) throw (0, f.error)("Page 注冊錯誤", "Please do not register multiple Pages in " + __wxRoute + ".js"),
   new a.AppServiceEngineKnownError("Please do not register multiple Pages in " + __wxRoute + ".js");
   __wxRouteBegin = !1;
   var t = __wxRoute;
   if (!A(t)) throw (0, f.error)("Page 注冊錯誤", __wxRoute + " has not been declared in app.json."),
   new a.AppServiceEngineKnownError(__wxRoute + " has not been declared in app.json.");
   var n = "undefined" != typeof __wxAppCode__ ? __wxAppCode__[t + ".json"] || {}: {};
   if ("Object" !== (0, f.getDataType)(e)) throw (0, f.error)("Page 注冊錯誤", "Options is not object: " + JSON.stringify(e) + " in " + __wxRoute + ".js"),
   new a.AppServiceEngineKnownError("Options is not object: " + JSON.stringify(e) + " in " + __wxRoute + ".js"); (0, f.info)("Register Page: " + t),
   void 0 !== n.usingComponents ? (__virtualDOM__.Page(e), M[t] = exparser.Component._list[t]) : M[t] = e
},

分析上述代碼,我們可以總結 pageHolder 方法的處理流程如下:

此外,我們可以發(fā)現(xiàn),與 App() 不同的是, 外部通過 Page() 函數(shù)傳入的(生命周期)代碼并不會在這里被執(zhí)行,而是等待頁面 Ready 并進入頁面進行實例化后才執(zhí)行。

頁面初始化流程

同樣地,根據(jù) page-frame.html 的加載順序,在 app.js 被加載并執(zhí)行后,小程序之后會先依次按順序加載所有的自定義組件代碼(如果有)并自動注冊。自定義組件(Component)在小程序開發(fā)中具有重要地位,它可以豐富小程序的基礎功能,擁有的能力比 

您可能感興趣:小程序開發(fā)
上一篇:京東小程序怎么裝修(適用移動端) 下一篇:微信小程序封裝get和post操作流程

電話咨詢 預約演示 0元開店