① 微信小程序事实上依旧是提供的webview执行环境 , 所以我们依旧可以在js环境中访问window、location等属性
② 微信小程序提供的展示的全部是Native定制化的UI , 所以不要去想DOM操作的事
这里各位可以想象为 , 小程序界面中有一块webview在执行真正的代码逻辑 , 只不过这个webview除了装载js程序什么都没做 , 而所有的页面渲染全部是js通过URL Schema或者JSCore进行的Native通信 , 叫Native根据设置的规则完成的页面渲染 。
全局控制器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同事的交互约定 , 小程序应该大同小异):
推荐阅读
- 风水珠帘多长合适 珠帘隔断风水挂多长
- 快手客服的话术技巧 快手小店自动回复语
- 小程序开发:调用百度文字识别接口实现图文识别,Node.js开发
- 小程序登录流程
- 程序员从新手成长到大牛的六个阶段,你是属于哪个阶段呢?
- CPU 的一些基本知识总结
- 小米返现1999哪里领 小米1999红包怎么领
- 轮滑鞋大小如何选择 轮滑鞋要买大一点的吗
- 一个男人经常换微信头像说明什么 经常换微信头像的人是什么性格
- 梦见和小孩打架自己赢了 梦见和小孩打架出血