当前位置: 主页 > 网络资讯 > 小程序

微信小程序架构原理基础详解

发布时间:2022-10-11 14:13   浏览次数:次   作者:网络

本篇文章给大家带来了关于微信小程序的相关问题,其中主要介绍了关于基础架构原理的相关内容,其中包括了宿主环境、执行环境、小程序整体架构、运行机制、更新机制、数据通信机制等等内容,下面一起来看一下,希望对大家有帮助。

微信小程序架构原理基础详解

【相关学习推荐:微信小程序】

下图为微信小程序的整体架构图:

11.png

发展由来

我们先来简单讲讲微信小程序的发展历,知己知彼方能百战不殆。微信小程序简称小程序。张小龙于2017年01月09日在微信公开课上宣布其正式上线。小程序英文名为 Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。

小程序上线以来,一直被称为便携版的 APP,关于两者之间的区别,无外乎是小程序相对轻便、开发成本低、开发周期短、收效快。

小程序并非凭空冒出来的一个概念,当微信中的 WebView 逐渐成为移动 Web 的一个重要入口时,微信就有相关的 JS API 了。

WebView 是移动端(手机、IPad)提供的运行 JavaScript 的环境,是系统渲染 Web 网页的一个控件,可与页面 JavaScript 交互,实现 APP 与 Web 的混合开发,WebView 渲染 Web 页面需要强大的渲染内核支持,这其中 Android 与 IOS 系统的内核又有所不一样。

根据了解,小程序诞生的背景主要推动力是由于移动网页在微信内传播体验不良,能力不强,当然我觉得这其中也有原生 APP 缺点原因的推动,比如每次都要从 App Store 或者其他应用市场下载,即使下载了,也占据系统很大的空间,如果不经常用,被用户删掉的可能性也非常大。

我们先抛开原生APP的问题不谈,对于移动网页在微信内传播体验不良,能力不强的问题,即使后来微信团队推出了 JS-SDK 来解决移动网页能力不足的问题,但 JS-SDK 的模式并没有解决使用移动网页遇到的体验不良的问题,这其中的原因大概能概括为这三个点:白屏问题、页面切换的生硬和点击的迟滞感。

为了解决这些问题,微信团队面临的问题是如何设计一个比较好的系统,使得所有开发者在微信中都能获得比较好的体验。这个问题是之前的 JS-SDK 所处理不了的,需要一个全新的系统来完成,它需要使得所有的开发者都能做到:

  • 快速的加载。

  • 更强大的能力。

  • 原生的体验。

  • 易用且安全的微信数据开放。

  • 高效和简单的开发。

这就是小程序的由来。文档

宿主环境

微信小程序的宿主环境为微信客户端,它是依赖于微信客户端上运行的,并且跟小程序 基础库 版本有重大关联关系。

我们可以把 微信客户端 以及 小程序基础库 简称为微信小程序的宿主环境。

微信小程序可以调用宿主环境提供的微信客户端的能力,可以完成许多普通网页无法完成的功能,这就使得小程序比普通网页拥有更多的能力。小程序会运行在不同版本(不同的微信客户端+不同基础库)的宿主环境下,因此针对各个版本的宿主环境做程序上的兼容也是在所难免的。

执行环境

小程序的主要开发语言是 Javascript,它与传统网页开发具有相似性但还是有一定区别:

  • 网页开发,渲染线程和脚本是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应的原因,本质就是我们常说的 JS 是单线程的。

  • 小程序,视图层和逻辑层是分开的,双线程同时运行,视图层的界面使用 WebView 进行渲染,逻辑层运行在 JSCore 中。

  • 网页开发,主要面对各厂商的浏览器,在移动端还需要面对 Safari、Chrome 以及 iOS、Android 系统中的各式 WebView。

  • 小程序,主要面对两大操作系统IOS和Android的微信客户端,还有开发工具、PC端(window)、Mac。开发时候需要注意的是微信客户端的版本号和小程序API 支持的基础库版本号。

微信小程序运行在多种平台上:iOS(iPhone/iPad)微信客户端、Android 微信客户端、PC 微信客户端、Mac 微信客户端和用于调试的微信开发者工具。

各平台脚本执行环境以及用于渲染非原生组件的环境是各不相同的,具体区别如下:

12.png

小程序整体架构

通过上面的内容,你应该大致了解小程序诞生的情况和所处的环境了,下面我们就来聊聊小程序的整体设计构架情况。

整个小程序系统构架分成两个部分:视图层(WebView) 和 逻辑层(App Service),这两个部分分别由两个独立线程管理。

  • 视图层:也称为渲染层,渲染层用来渲染页面结构,主要由 WebView 进行渲染,一个小程序可以存在多个界面,所以渲染层可能存在多个 WebView 线程。

  • 逻辑层:逻辑层采用 JSCore 线程运行 JS 脚本。逻辑层主要用来逻辑处理、数据请求、接口调用等。

视图层和逻辑层之间的沟通则需要借助 系统层(WeixinJsBridage) 进行通信,逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层把触发的事件通知到逻辑层进行业务逻辑处理。

页面渲染大致过程为:我们把项目进行编译会把 WXML 转化成对应的 JS 对象(Virtual DOM),在逻辑层发生数据变化的时候,我们会通过 setData() 方法把数据从逻辑层传递到视图层,视图层在接收到数据后,会内部进行差异对比,把差异应用在原来的 Dom 树上,再正确的渲染出 UI 界面,完成页面的渲染过程。

通过上面的分析,你是否能理解开头放置的架构图了

上面的分析还提及到了一个 系统层(WeixinJsBridage),一般简称为 JSBridge,它起到了一个中间桥梁的作用,非常重要。它不仅让视图层与逻辑层两个单独线程能进行通信,而且也架起上层开发与系统底层功能(Native)的桥梁,使得小程序可以通过调用 API 使用原生功能,且部分组件用原生组件实现,从而有良好体验。

逻辑层还有一个重要的操作,发送网络请求,它也是经由 系统层 转发的。

讲到这里,希望你对小程序的整体架构有一定认识了,下面我们开始就讲一下小程序内部的一些机制情况了。

运行机制

小程序启动运行两种情况:

  • 冷启动(重新开始):用户首次打开或者小程序被微信主动销毁后再次打开的情况,此时小程序需要重新加载启动,即为冷启动。

  • 热启动:用户已经打开过小程序,然后在一定时间内再次打开该小程序,此时无需重新启动,只需要将后台态的小程序切换到前台,这个过程就是热启动。

需要注意:

1.小程序没有重启的概念。

2.当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后会被微信主动销毁。

3.短时间内收到系统两次以上内存警告,也会对小程序进行销毁,这也就为什么一旦页面内存溢出,页面会奔溃的本质原因了。

更新机制

小程序 冷启动 时如果发现有新版本,将会异步下载新版本的包,并同时会先用客户端本地的旧包进行启动,等下次冷启动才会应用上。如果需要马上应用最新版本,可以用 wx.getUpdateManager API 进行处理。

const updateManager = wx.getUpdateManager()
updateManager.onCheckForUpdate(function (res) {
  // 请求完新版本信息的回调
  console.log(res.hasUpdate)
})
updateManager.onUpdateReady(function () {
  wx.showModal({
    title: '更新提示',
    content: '新版本已经准备好,是否重启应用?',
    success(res) {
      if (res.confirm) {
        // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
        updateManager.applyUpdate()
      }
    }
  })
})
updateManager.onUpdateFailed(function () {
  // 新版本下载失败
})


# 客户端  # 帐号  # 新版本  # 数据通信  # 多个  # 都是  # 有一定  # 这句话  # 都能  # 它是  # 内嵌  # 问题是  # 重启  # 就会  # 绑定  # 是一种  # 是因为  # 程序开发  # 那就  # 冷启动 


相关栏目: 【 网站优化84359 】 【 站长学院75356 】 【 运营推广7218 】 【 小程序18188 】 【 运维技术36808 】 【 营销推广32536 】 【 SEO优化41416 】 【 百度推广27695 】 【 AI推广83940


相关推荐: 掌握 PHP 函数分类的精髓  浅析小程序中怎么实现Icon图标?  微信单图文、多图文推送、列表中排序  小程序中的tabbar组件不显示是什么原因  手把手教你在小程序中实现内容搜索功能  vscode英文翻译  C++ 函数的内存管理与优化  golang框架如何与安全团队协作?  golang框架如何在高并发场景中实现负载均衡  怎么使微信小程序支持async await?  C++ 函数库在不同编程场景中的应用区别?  手把手带你看看小程序如何优化?(实践总结)  怎么关闭微信服务通知  什么是微营销?  C++ 函数指针和函数对象的区别与联系  malloc函数的使用原理是什么  标准模板库中有哪些主要容器类型?  小程序中怎么进行父子组件传值和方法调用?(方法汇总)  通过实例了解一下小程序中怎么实现canvas拖动功能  C++ 函数重载在 C++20 标准中的更新  微信小程序怎么开发加载npm包?方法介绍  微信通过某个事件推送消息  golang框架在高并发场景中的事件驱动模型实践  C++ 函数调用约定和栈帧管理的工程实践与性能优化  PHP 函数如何返回一个 DOM 元素  PHP 函数如何返回闭包  小程序怎么获取当前日期  微信小程序 数据访问实例详解  介绍微信小程序 canvas开发的注意事项  C++ 函数调用约定与栈帧的管理方式  streamlit怎么样监听组件的状态  微信朋友圈怎么发文字  C++ 函数参数传递中的默认参数机制是如何工作的?  微信小程序 数组(增,删,改,查)等操作实例详解  浅析小程序中的插槽、父子组件通讯的几种方式  printf输出汉字格式  C++ 中函数指针和函数对象在不同库中的实现?  golang框架的安全性考虑:如何处理敏感数据?  Python - 使用 Faker 生成假数据  微信小程序 wx:key详细介绍  C++ 函数中默认参数与可变参数的使用  怎么恢复微信黑名单好友  泉立方洗衣片怎么样?刘涛代言的吗?做微商怎么找客源?  C++ 函数的参数传递机制如何影响对象的生命周期?  微信小程序 省市区选择器实例详解  PHP 函数如何与数据库扩展?  如何使用 PHP 函数扩展增强命令行工具?  小程序中怎么安装和使用UI组件库  手把手教你怎么在小程序中使用字体图标  微信小程序 参数传递详解