百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

小程序框架搭建(小程序框架选型)

ccwgpt 2024-09-23 04:41 76 浏览 0 评论

模拟手机设备

我们需要在浏览器上模拟一个手机设备,这个设备有一个 app 容器节点,用来挂载微信应用

这个事情交给 Device 类来完成,它的结构如下:

  1. init 是初始化方法,用于初始化 Device 信息
  2. updateDeviceBarColor 是用来设置状态栏颜色的函数 状态栏目前支持 black 和 white 如果在深色背景下,需要将状态栏设置为 white 如果在浅色背景下,需要将状态栏设置为 black
  3. open 方法是用来将应用挂载到 app 容器节点,也就是 appContainer

微信应用

手机设备准备好之后,就需要准备微信应用,这里我们只有准备两个页面:

  • 发现页面:Home
  • 小程序列表页面:MiniAppList

通过发现页的小程序进入小程序列表,然后点击某个小程序加载对应的小程序

要实现这样的逻辑,我们需要准备 3 类:

  • Application:用来承载微信应用
  • Home:发现页面
  • MiniAppList:小程序列表页面

这 3 个类的结构如下:

Home 类:

  • bindEvent 用来绑定点击事件
  • jumpToMiniAppListPage 点击事件触发时调用,跳转到小程序列表页面

MiniAppList 类:

  • createAppList 用来创建小程序列表
  • bindReturnEvent 点击左上角返回按钮时调用,返回到发现页面
  • bindOpenMiniApp 点击小程序时调用,打开对应的小程序

Home 和 MiniAppList 两个页面都有三个钩子函数

  • viewDidLoad:页面初始化时触发
  • onPresentIn:页面进入视图时触发
  • onPresentOut:页面离开视图时触发

他们的操作时序如下:

小程序初始化

当我们打开小程序时,会从底部拉起一个视图,然后在这个视图内加载小程序

这个视图就是小程序的容器,微信给每个小程序单独分配一个这样的容器,单独加载一个应用

所以小程序的初始化可以分为两个部分:

  • 容器的初始化
  • 应用的初始化

容器的初始化

容器初始化,我们需要创建两个类:

  • MiniAppSandbox:小程序容器 加载小程序应用
  • AppManager:容器管理 作用是用来调度小程序,比如说打开一个小程序或者关闭一个小程序

结构如下:

MiniAppSandbox 类:

  • openApp:当前小程序列表中某个小程序被点击时调用,打开对应的小程序容器
  • closeApp:当小程序右上角药丸按钮点击时调用,关闭当前小程序容器

AppManager 类:

  • showLaunchScreen:小程序容器启动时,需要显示一个启动画面
  • updateActionColorStyle:更新小程序右上角药丸按钮的颜色
  • bindCloseEvent:点击小程序右上角药丸按钮时调用,关闭当前小程序容器

时序如下:

应用初始化

当我们在小程序列表页面点击某个小程序时,微信会去开放平台拉取这个小程序的相关信息,先进行容器的初始化,容器初始化完成之后会在页面渲染一个 loading 动画

在 loading 动画进行时,小程序会进行应用的初始化,应用初始化完成之后,会将 loading 动画替换为小程序的内容

这个小程序的信息就是我们平时开发的小程序,打包后的内容

应用初始化需要完成两件事情:

  1. 读取小程序配置文件:全局配置 和 页面配置
  2. 创建一个逻辑线程挂载到小程序容器上 每个小程序都有一个独立的逻辑线程 一个小程序共用一个逻辑线程

小程序应用初始化的需要完成 6 件事情:

  1. 拉取小程序的资源
  2. 读取小程序的配置文件
  3. 设置状态栏的颜色
  4. 创建通信桥 bridge
  5. 触发应用的初始化逻辑
  6. 隐藏启动动画

拉取小程序资源

实际的微信小程序它是会去开放平台拉取小程序的资源,这里我们只是模拟,直接把打包好的小程序放到 apps 目录下

我们直接去 apps 目录下读取小程序的资源

读取小程序配置文件

小程序打包时会页面所有的配置文件和全局配置文件统一放到一个 json 文件中

  • 全局配置文件会放到 app 字段中
  • 页面配置文件会放到 modules 字段中 页面路径作为 key


设置状态栏的颜色

在小程序的官方文档中状态栏的颜色可以全局设置,也可以单独设置

所以我们在读取小程序配置文件时,需要将页面的配置信息和全局的配置信息进行一个合并,如果页面的 page.json 中有设置,就使用页面的设置,否则使用全局的设置


合并完配置信息后,就可以根据当前页面的配置信息设置状态栏的颜色

创建通信桥 bridge

小程序容器初始化后,就要为小程序分配一个逻辑线程和渲染线程

渲染线程和逻辑线程之间不能直接进行通信,它们需要通过主线程进行中转,这个主线程就是这里的通信桥 bridge

bridge 的结构如下:

  • init 方法是用来初始化 bridge

通信桥 bridge 创建完成之后就要创建逻辑线程和渲染线程了

线程建设

不管是逻辑线程还是渲染线程,在线程建设的时候都分为两个步骤:

  1. 线程初始化
  2. 通信通道建设

逻辑线程初始化

逻辑线程初始化为每一个应用分配一个 JSCore,结构如下:

  • init 方法是初始化 JSCore,用来加载一个 js 文件 加载文件是一个异步过程 这个 js 文件就是逻辑线程的 SDK 在小程序中使用的 wx、Page、App 等方法都是在这个 SDK 中定义的

这个 SDK 我们是单独起一个 Logic 项目来完成,所有的信息都在这个 SDK 中定义

JSCore 使用 Worker 来加载这个 SDK,因为 Worker 是一个独立的线程,不会阻塞主线程

下面代码是 JSCore 的初始化代码:

  • 由于 Worker 有同源策略,不能直接加载 Logic 中的文件
  • 需要通过 fetch 读取到 SDK 的文件内容,染红通过 Blob 和 URL.createObjectURL 来加载
  • 将 Blob 对象的 URL 传递给 Worker 来加载

逻辑线程通信建设

原生层需要向逻辑线程通信的话,调用 jscore 中 web worker 的 postMessage,将消息发送给 SDK

SDK 需要一个 Message 类来处理消息,同时,我们还需要一个 MessageManager 类,它的作用是监听 Message 中指定类型的消息,当 Message 类接收到指定类型的消息时,就会通知到 MessageManager,MessageManager 会调用对应的功能模块

Message 类的结构如下:

  • receive 是用来监听原生层消息
  • send 是用来向原生层发送消息

MessageManager 类的结构如下:

Message 和 MessageManager 之间的关系如下:

MessageManager 在 SDK 初始化时就会调用,在 SDK 初始化时需要监听来在原生成小消息,比如资源加载,监听的函数是调用 Message 中的 receive 方法,资源加载完了需要通知原生层,调用 Message 中的 send 方法

SDK 的通信建设完成后,原生层也需要进行通信建设

原生层的通信建设涉及到 JSCore 和 Bridge

JSCore 和 Bridge 之间的关系如下:

  1. Bridge 调用 JSCore.addEventListener 注册一个 message 的消息,消息处理函数:jscoreMessageHandler
  2. JSCore 在初始化时会注册一个 SDK 的消息
  3. 当 SDK 发送消息被 JSCore 接收到时,JSCore.addEventListener 就会被触发,Bridge.jscoreMessageHandler 就会被调用

它们的工作时序如下:

渲染线程初始化

渲染线程是用 webview 实现的,它是在 Bridge 初始化完成后,它的结构如下:

创建 webview 的代码如下:

  • 实例化 webview 后,调用 init 方法初始化 webview
  • 由于 init 方法是一个异步的过程,所以用 Promise 封装一下,让 bridge 能够拿到 webview 实例
js

代码解读

复制代码

// bridge.js createWebview() { return new Promise((resolve) => { const webview = new WebView({}); webview.parent = this; webview.init(() => { resolve(webview); }); this.parent.webviewsContainer.appendChild(webview.el); }); }

在 Bridge 中实例化 Webview 后,调用 webview.init,进入 webview 的初始化过程

  1. 由于 iframe 是一个异步的过程,所以我们需要用 Promise 来封装 iframe 的初始化过程
  2. 监听 iframe 的消息 在 iframeWindow 中监听注册一个 onReceiveUIMessage 方法 当 iframe 发送消息时,会调用 onReceiveUIMessage 方法,webview 就会收到消息


渲染线程通信建设

渲染线程的通信通道建设和逻辑线程的通信通道建设类似,只是渲染线程是通过 iframe 和 window.postMessage 来实现的

渲染线程是用 iframe 实现的,用 iframe 加载 uiSDK 中的 js 文件,然后渲染页面,渲染线程和原生层交互是通过 JSBridge 来实现的

  • 原生层调用 onReceiveNativeMessage 向 iframe 中发送消息
  • 渲染线程调用 onReceiveUIMessage向原生层发送消息

所以渲染线程也需要 Message 和 MessageManager,Message 提供也提供 receive 和 send 两个方法

它们的时序如下:

总结

他们完整的逻辑时序如下:



原文链接:https://juejin.cn/post/7369838480983474226

相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: