为了让你们更好的理解小程序的一些限制和作一些优化,下面从小程序的基础架构讲起,若有不对的地方,望指正,请轻喷 😄程序员
首先,咱们看看下图,小程序的架构以下: canvas
那若是在10层页面栈的限制内,因为页面的内容过于复杂,内存爆了怎么办? 小程序内部有一个回收机制,若是内存紧张时,会回收掉一部分 WebView 。小程序
不少人可能会以为, 10 层页面栈基本已经够用了,无须关注这方面的限制了。数组
可是若是出现循环引用的话,用户反复点击,则很容易出现爆栈的状况。 以下图:浏览器
固然,做为一个程序员,我并不想在跳转的时候去时时刻刻的关注我有没有正确引用,有没有超出10层页面栈。 彻底能够对小程序的跳转作一个封装。缓存
由于只有 wx.navigateTo 才会使页面栈 + 1 ,那咱们只要对这个方法作一层兜底处理便可。 以下代码:bash
const PAGE_LIMIT = 10
const pages = getCurrentPages()
if(pages.length >= PAGE_LIMIT) {
// 使用 wx.redirectTo 方法
}
复制代码
这样就能够为所欲为的跳来跳去了。cookie
小程序的逻辑层是在 JsCore 中运行的。限制以下:网络
仍是从一张图提及: 架构
像 canvas , video ,input ,map ,picker …… 组件,官方直接使用原生组件,渲染方式以下图:
从上图很容易就能够看出,Navtive 组件的层级是最高的,那么仅仅去改变 z-index 也没法让其余组件覆盖原生组件。还好,官方给出了一个解决方案:
若是以往在移动端, PC 的接口会使用 Cookie 进行一些处理,那在小程序中使用该接口就比较尴尬了。
所以,咱们能够在小程序中也模拟出 Cookie ,以下图:
在 Storage 中隔离一个字段,用来作 Cookie ,下面用了一个小技巧,把 Cookie 的内容存放于内存中,而非每次都从 storage 中读取。
let cookie = (function(){
return wx.getStorageSync('cookies');
}())
const Cooke = {
getCookie(){}, //从内存中获取cookie
setCookie(){}, // 设置cookie
setCookieInHeader(){}, //根据response的Header设置cookie
removeCookie() {}, //删除cookie
isExpired() {} //判断是否过时
}
复制代码
而后,咱们在每次 Request 成功后,解析 Header 中 SET-COOKIE 属性设置 Cookie ,在每一次请求的时候,手动在 Header 中设置 Cookie 。这样就完美地模拟浏览器的 Cookie 概念了。
设置一个队列,若是请求处理完毕,则移出队列,若是当前数组超过10个请求,则进入等待状态。大概代码以下:
class Request {
constructor() {
this.maxLimit = 10;
this.requestQueue = []; // 请求队列
this.requestIng = 0; //当前并发数
}
request () {
// 判断是否超出并发数
if(this.requestIng >= this.maxLimit) {
// 推入请求队列
}else {
this.requestIng ++;
// 执行成功后 - 1 ,从 requestQueue 中取出从新请求
}
}
}
复制代码
好吧,仍是从一张图提及,显然,咱们能够看出,每一次 setData 都是一次线程通讯。
data: {
array: {
changeData: '我改变了',
noChangeData: '我没有改变'
},
},
this.setData({
'array.changeData':'changed data'
})
复制代码
data: {
view: '与界面相关的数据'
},
noRelaView: '与界面无关'
复制代码
@Author:beidan