首页/新闻资讯/正文
动手实现微信小程序编译打包及运行,详解相关操作与代码

 2025年08月26日  阅读 1

摘要:1.微信小程序项目初始化分析打开微信开发者工具创建默认小程序项目时,系统会自动生成首页(index)和日志页(logs)。观察app.js文件可发现,初始化阶段包含以下关键信息:ctx.body数据集可直接复制开发者工具中的静态数据实际应用时需将路径参...

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;
}

版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;

原文链接:http://wen.bjhwtx.com/post/35845.html

标签:

博览广文网

博览广文网为所有文学爱好者、新闻爱好者、关注生活多方面内容的观众朋友提供多方位的内容呈现、提升阅读空间、填充碎片时间,开阔读者的视野、增长见识、了解民生、一个让您不出户尽知天下事的网站平台!
热门标签
关于我们
广文舒阅网—让天下读者有家可归!这里汇聚了各类优质文化信息,无论是全球热点、历史故事,还是实用百科、趣味探索,您都能轻松获取。我们希望用阅读点亮您的世界,让每一次浏览都充满收获和乐趣。
导航栏A标题
广文舒阅网
扫码关注
联系方式
全国服务热线:0755-88186625
Q Q:8705332
Email:admin@lanyu.com
地址:深圳市福田区海雅缤纷国际大厦5层501
Copyright 深圳市蓝宇科技有限公司 版权所有 备案号:京ICP备20013102号-1