信息化管理系统 | 数字孪生 · 智慧园区 · 数字大屏 | App · 微信 · 小程序 | 元宇宙 · 区块链 · 3D展厅 | 虚拟仿真系统 | 新零售电商

开发微信小程序方案(3)

全局控制器App

 

开发微信小程序,也常用到那下面的介绍内容。

这里我们重点关注全局控制器App这个类做了什么,因为拿不到源码,我们这里也只能猜测加单步调试了,首先微信容器会准备一个webview容器为我们的js代码提供宿主环境,容器与构建工具会配合产出以下页面:

 

他在这里应该执行了实例化App的方法:

 

 

这一坨代码,在这个环境下便相当晦涩了:

 

y = function() {

            function e(t) {

                var n = this;

                o(this, e),

                s.forEach(function(e) {

                    var o = function() {

                        var n = (t[e] || i.noop).bind(this);

                        Reporter.__route__ = "App",

                        Reporter.__method__ = e,

                        (0,

                        i.info)("App: " + e + " have been invoked");

                        try {

                            n.apply(this, arguments)

                        } catch (t) {

                            Reporter.thirdErrorReport({

                                error: t,

                                extend: "at App lifeCycleMethod " + e + " function"

                            })

                        }

                    };

                    n[e] = o.bind(n)

                });

                for (var r in t)

                    !function(e) {

                        g(e) ? (0,

                        i.warn)("关键字保护", "App's " + e + " is write-protected") : v(e) || ("[object Function]" === Object.prototype.toString.call(t[e]) ? n[e] = function() {

                            var n;

                            Reporter.__route__ = "App",

                            Reporter.__method__ = e;

                            try {

                                n = t[e].apply(this, arguments)

                            } catch (t) {

                                Reporter.thirdErrorReport({

                                    error: t,

                                    extend: "at App " + e + " function"

                                })

                            }

                            return n

                        }

                        .bind(n) : n[e] = t[e])

                    }(r);

                this.onError && Reporter.registerErrorListener(this.onError);

                var l = function() {

                    "hang" === (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).mode && (f = !0);

                    var e = (0,

                    a.getCurrentPages)();

                    e.length && (e[e.length - 1].onHide(),

                    (0,

                    u.triggerAnalytics)("leavePage", e[e.length - 1], !0)),

                    this.onHide(),

                    (0,

                    u.triggerAnalytics)("background")

                }

                  , h = function() {

                    var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};

                    if (0 === e.scene || "0" === e.scene ? e.scene = c : c = e.scene,

                    e.query = e.query || {},

                    (0,

                    i.hasExitCondition)(e) && (p = !0),

                    this.onShow(e),

                    (0,

                    u.triggerAnalytics)("foreground"),

                    d || e.reLaunch)

                        d = !1;

                    else {

                        var t = (0,

                        a.getCurrentPages)();

                        t.length && (t[t.length - 1].onShow(),

                        (0,

                        u.triggerAnalytics)("enterPage", t[t.length - 1], !0))

                    }

                };

                if ("undefined" != typeof __wxConfig && __wxConfig) {

                    var y = __wxConfig.appLaunchInfo || {};

                    y.query = y.query || {},

                    c = y.scene,

                    (0,

                    i.hasExitCondition)(y) && (p = !0),

                    this.onLaunch(y),

                    (0,

                    u.triggerAnalytics)("launch"),

                    h.call(this, y)

                } else

                    (0,

                    i.error)("App Launch Error", "Can not find __wxConfig");

                wx.onAppEnterBackground(l.bind(this)),

                wx.onAppEnterForeground(h.bind(this)),

                _.call(this, "function" == typeof t.onPageNotFound)

            }

            return r(e, [{

                key: "getCurrentPage",

                value: function() {

                    (0,

                    i.warn)("将被废弃", "App.getCurrentPage is deprecated, please use getCurrentPages.");

                    var e = (0,

                    a.getCurrentPage)();

                    if (e)

                        return e.page

                }

            }]),

            e

        }();

 

 

 

这里会往App中注册一个事件,我们这里注册的是onLaunch事件,这里对应的是当小程序初始化时候会执行这个回调,所以原则上应该是Native装在成功后会执行这个函数,这里再详细点说明下H5与Native的交互流程(这里是我之前做Hybrid框架时候跟Native同事的交互约定,小程序应该大同小异):

 

我们一般是在全局上会有一个对象,保存所有需要Native执行函数的对象,比如这里的onLaunch,Native在执行到一个状态时候会调用js全局环境该对象上的一个函数

因为我们js注册native执行是以字符串key作为标志,所以Native执行的时候可能是window.app['onLauch...']('参数')

 

而我们在window对象上会使用bind的方式将对应的作用域环境保留下来,这个时候执行的逻辑便是正确的

 

这里在开发微信小程序全局没有找到对应的标识,这里猜测是直接在app对象上,Native会直接执行APP对象上面的方法,但是我这里有个疑问是View级别如果想注册个全局事件该怎么做,这个留到后面来看看吧,这里是Native载入webview时,会执行对象定义的onLaunch事件,在下面的代码看得到:

 

 

这里会结合app.json获取首先加载页面的信息,默认取pages数组第一个,但是具体哪里获取和设置的代码没有找到,也跟主流程无关,我们这里忽略……然后我们看到代码执行了onShow逻辑:

 

 

然后流转到注册微信容器层面的事件,我觉得,无论如何,这里应该是像微信容器注册事件了吧,但是我找不到全局的key

 

 

 

开发小程序方案系列1、2、3、4、(更新完毕)

 

 

 

作者:叶小钗  转自公众号  前端大全

http://www.cnblogs.com/yexiaochai/p/9346043.html

 

 

开发微信小程序方案未完待续……