1. 微信小程序项目初始化分析
打开微信开发者工具创建默认小程序项目时,系统会自动生成首页(index)和日志页(logs)。观察app.js文件可发现,初始化阶段包含以下关键信息:
ctx.body数据集可直接复制开发者工具中的静态数据
实际应用时需将路径参数等改为动态变量
//app.js
App({
onLaunch: function () {
// 展示本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
}
})
}
}
})
},
globalData: {
userInfo: null
}
})
wx.getStorageSync('logs')等同步API被SDK封装了一层转换逻辑
2. 全局数据存储模拟方案
日志页调用的存储API可通过三种方式模拟:
router.post('/apihelper/assdk', async (ctx, next) => {
const { api, args } = JSON.parse(ctx.request.body);
if (api === 'getSystemInfo') {
ctx.body = {
'errMsg': 'getSystemInfo:ok',
'model': 'iPhone 7 Plus',
'pixelRatio': 3,
'windowWidth': 414,
'windowHeight': 624,
'system': 'iOS 10.0.1',
'language': 'en',
'version': '7.0.4',
'screenWidth': 414,
'screenHeight': 736,
'SDKVersion': '2.7.1',
'brand': 'devtools',
'fontSizeSetting': 16,
'benchmarkLevel': 1,
'batteryLevel': 100,
'statusBarHeight': 20,
'safeArea': { 'right': 414, 'bottom': 736, 'left': 0, 'top': 20, 'width': 414, 'height': 716 }
};
}
})
基础方案:使用Map对象临时存储键值对
标准方案:采用浏览器localStorage实现持久化
进阶方案:引入npm存储库如store.js处理复杂场景
注意初始化时存储空间为空,需通过wx.setStorageSync先写入测试数据。
3. 登录凭证获取机制解析
wx.login()获取code的流程呈现典型异步特征:
var r = re.IS_IOS ? "setStorage" : "setStorageSync"
var r = re.IS_IOS ? "getStorage" : "getStorageSync"
1) 逻辑层发起HTTPS请求
2) 微信服务器返回临时凭证
const storage = new Map();
const getStorage = function (key) {
return storage.get(key);
};
const setStorage = function (key, value) {
storage.set(key, value);
};
const removeStorage = function (key) {
storage.delete(key);
};
module.exports = {
getStorage,
setStorage,
removeStorage
};
3) 通过回调函数传回code参数
该过程需注意网络隔离策略,建议在模拟环境使用定时器模拟微信服务端响应。
4. 页面路由事件处理方案
页面跳转触发onRoute事件时,日志显示关键参数:
path: 当前页面路径
type: 导航类型(navigate/redirect/switchTab)
返回操作需特殊处理:
1) 建立事件总线系统统一管理路由
2) 实现页面栈管理模块
3) 开发路由拦截中间件
constructor(wxConfig = {}, socketPort) {
super();
this.wxConfig = wxConfig;
this.systemManager = new SystemManager(this, wxConfig);
this.navigatorManager = new NavigatorManager(this, wxConfig);
this.pageManager = new PageManager(wxConfig, socketPort);
this.tabbarManager = new TabbarManager(this, wxConfig);
this._render();
this._launch();
window.socketClient.setEmitter(this);
}
5. 系统架构设计要点
完整模拟需包含以下核心模块:
消息管道:按固定格式收发消息
this.domElement = document.createElement('div');
this.domElement.id = 'container';
this.domElement.style = ` height: ${global.simulator.height}px; width: ${global.simulator.width}px;`
// system
this.domElement.appendChild(this.systemManager.domElement);
// navigator
this.domElement.appendChild(this.navigatorManager.domElement);
// pages
this.domElement.appendChild(this.pageManager.domElement);
// tabbar
this.domElement.appendChild(this.tabbarManager.domElement);
API网关:处理wx.*方法调用
事件中心:管理页面生命周期事件
虚拟DOM:同步视图层更新
建议先实现基础消息系统,逐步添加路由管理、数据同步等模块。后续将详细讲解如何构建完整的浏览器运行环境方案,重点包括沙箱隔离机制和原生组件通信实现。
navigateBack (path, query) {
let currentWebview = this.domElement.children.item(0);
let currentIndex = currentWebview.style['z-index'];
this.domElement.removeChild(currentWebview);
let targetPage = null;
for (let i = 0; i < this.domElement.children.length; i++) {
let webview = this.domElement.children.item(i);
if (webview.style['z-index'] === `${currentIndex - 1}`) {
let viewId = +webview.getAttribute('data-view-id');
let path = webview.getAttribute('data-view-path');
let query = JSON.parse(webview.getAttribute('data-view-query'));
window.socketClient.send(WebsocketMessage.onAppRoute(viewId, path, query, 'navigateBack'));
window.socketClient.send(WebsocketMessage.onAppRouteDone(viewId, path, query, 'navigateBack'));
targetPage = path;
break;
}
}
return targetPage;
}
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态