【小程序八股文】系列之篇章二 | 小程序的核心机制

【小程序八股文】系列之篇章二 | 小程序的核心机制

  • 前言
  • 三、微信小程序原理与运行机制
  • 简述一下微信小程序的原理
    • 微信小程序的双线程的理解
      • 为什么不采用浏览器多线程模式?为什么是双线程?`(出发点:安全,快速,方便管控,迭代独立)`
      • 双线程模式的流程
      • 为什么要多个WebView
    • 微信小程序的通信机制的理解(双线程机制下的通信原理)
    • 微信小程序的界面渲染的整体流程
    • 微信小程序的数据驱动的理解
    • 微信小程序如何进行双向绑定?
    • 微信小程序,为什么使用js闭包?
  • 下篇笔记链接

前言

上一章中我们主要介绍两个部分的内容:一个是小程序的基础/背景,另外一个是小程序与其他平台的区别。
上一章笔记链接:
【小程序八股文】系列之篇章一 | 小程序基础及与其他产品区别
那么在这一篇章中,我们主要介绍小程序的核心机制,因为核心机制比较重要,所以我把它单独作为一章来写。

三、微信小程序原理与运行机制

这里主要是介绍小程序的原理及运行机制

简述一下微信小程序的原理

  1. 微信小程序采用 JavaScript、WXML、WXSS 三种技术进行开发,本质就是一个单页面应用,所有的页面渲染和事件处理,都在一个页面内进行,但又可以通过微信客户端调用原生的各种接口

  2. 微信小程序基于数据驱动的架构模式,也就是它的 UI 和数据是分离的,所有的页面更新,都需要通过对数据的更改来实现。

  3. 微信小程序是一个双线程的框架,也就是说渲染进程WebView和脚本进程JSCore是互相独立的。这两个进程分别管理微信小程序框架的两个组成部分视图层(也叫做渲染层)和逻辑层。其中,视图层View用来渲染页面结构,展现UI,逻辑层appService用来处理业务逻辑、数据及接口调用。它们分别在渲染线程和脚本进程中运行,并通过系统层 JSBridge 实现通信,实现 UI 的渲染、事件的处理。

    (从上面可以看除微信小程序具有三个层次:视图层(View),逻辑层(APP Service),系统层(Native);两个进程:渲染进程和脚本进程)。

    在这里插入图片描述

微信小程序的双线程的理解

为什么不采用浏览器多线程模式?为什么是双线程?(出发点:安全,快速,方便管控,迭代独立)

上面两个问题都是小程序双线程框架的背景。

  • 小程序双线程框架出发点是在保证微信安全的前提下提供一种轻量化,快速便捷的应用程序。这就需要同时兼顾安全和性能。而浏览器采用的是多线程的模式,会为每个标签页添加一个独立的渲染进程,每个进程之间的资源和行为互不干扰,虽然这样可以保证网页独立稳定的运行,但同时也消耗了较多的资源。网站是依赖于浏览器的,有关Web相关的技术比较全面,可以承载一些庞大的应用程序,但微信小程序的宿主是微信,定位也是轻量化,并不需要太过丰富的Web能力,因此,多线程的设计不能够很多好的满足微信小程序设计的初衷。

  • 跟网站于浏览器的关系相比,我认为小程序与微信的关系更加接近CodePen这类(一个前端编程神器)在线编程平台中每个程序案例与平台的关系。小程序的版本迭代是独立的,不依赖于微信。

  • 为了实现版本迭代的独立性,同时兼顾安全性(禁止程序操作DOM),一般有两种方法,一种是采用Web Worker, 另外一种是采用Shadow DOM。但Shadow DOM 的兼容性较差,不适合推广,因此,采用类似Web Worker的方案更加现实。但Web Worker 非常耗费资源,无法兼顾小程序轻量化的要求,因此,小程序采用一种类似Web Worker的新方案,也就是双线程模式。

    【拓展】

    • Web Worker 和Shadow DOM
      • Web Worker 是线程安全的,Worker 内的 JavaScript 代码无法获取 Window 和 Document 对象,也就无法操作 DOM。除此之外,由于 Worker 的线程安全特性,Worker 内的代码运行过程中不会阻塞外层的 GUI 渲染线程,两者可以并行。
      • 而 Shadow DOM 是 Web Components 规范的一部分,将 ShadowRoot 的模式设置为 closed 就可以禁止获取到 ShadowRoot 节点,从而也无法操作其内部的 DOM。
    • Web Worker
      从名字上就可以看出,web worker就是在web应用程序中使用的worker。这个worker是独立于web主线程的,是一个运行在后台的JS线程,不会影响页面的响应。如果将 docs 表格中复杂计算放到主线程中,页面不仅可能卡顿,甚至可能崩溃掉。将计算挪入 web worker 中,将计算结果事件回调的方式返回,可以让用户使用更加流畅。
  • 采用双线程模式也可以更加方便对小程序的管控。跟Web Worker类似,小程序将业务及数据的处理独立于页面的渲染进程,即使用类似Web Worker 的独立线程运行逻辑,使用 Webview 渲染 UI。但不同的是,小程序并没有使用Web Worker 子线程,而是一个独立的“主线程”,这样子可以保证更好的性能,其实本质上也是做沙盒的思想。
    在这里插入图片描述渲染线程使用 Webview 进行 UI 的渲染呈现。Webview 是一个完整的类浏览器运行环境,本身具备运行 JavaScript 的能力,但是小程序并不是将逻辑脚本放到 Webview 中运行,而是将逻辑层独立为一个与 Webview 平行的线程,使用客户端提供的 JavaScript 引擎运行代码,iOS 的JavaScriptCore、安卓是腾讯 X5 内核提供的 JsCore 环境以及 IDE 工具的 nwjs 。

    • 使用客户端系统的JavaScript 引擎提供一个沙箱环境来运行开发者的 JavaScript代码(安全管控需求)
    • 并且逻辑线程是一个只能够运行 JavaScript 的沙箱环境(这个沙箱环境只提供纯 JavaScript 的解释执行环境,没有任何浏览器相关接口)。不提供 DOM 操作相关的 API,所以不能直接操作 UI,只能够通过 setData 更新数据的方式异步更新 UI。

双线程模式的流程

在这里插入图片描述

  • 在小程序中,选择了 Hybrid的渲染方式,将视图层和逻辑层是分开的,双线程同时运行,视图层的界面使用 WebView进程进行渲染,逻辑层运行在 JSCore进程中。
  • WebView 主要处理 WXML 和 WXSS,负责渲染等工作,多个页面会创建多个 WebView 线程。WebView直译是网页视图,就是原生应用中的浏览器引擎。简单来说 webview 是手机中内置了一款高性能 webkit 内核浏览器,不过没有提供UI(地址栏、导航栏),只是单纯的展示一个网页界面。
  • JsCore 主要执行业务逻辑代码。
  • 渲染层和逻辑层通过 Native 来进行通信。例如请求数据WebSocket 都是通过 Native 来执行后给 JsCore 处理或者给 WebView 来渲染。
  • 小程序中为了达到多页面体验的功能,需要使用到多个WebView,每个WebView对应的就是一个小程序的页面。WebView和JsCore这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,线程之间的通讯、数据的传递以及逻辑层发送网络请求也都是经由Native转发

为什么要多个WebView

多个WebView可以理解为多页面应用,其实是有区别于单页面应用SPA的,SPA渲染页面是通过路由识别以后去动态地将页面挂载到root节点里,如果SPA打开一个新页面,是需要卸载掉当前的页面,然后重新渲染。很显然,只有通过多个WebView才能更加接近原生应用APP的用户体验。

💡 既然一个页面一个WebView线程,那每一page线程都有对应的js线程吗?还是js线程是处理所有page线程的逻辑呢?
逻辑线程是跟页面无关的,只负责执行js代码,而且小程序同一时间只能显示一个页面,所以同一个逻辑线程可以支持所有的渲染线程。

微信小程序的通信机制的理解(双线程机制下的通信原理)

小程序的通信机制——WeixinJSBridge
在这里插入图片描述

  • 在小程序中,选择了 Hybrid的渲染方式,将视图层和逻辑层是分开的,双线程同时运行,视图层的界面使用 WebView进程进行渲染,逻辑层运行在 JSCore进程中。
  • 线程的通信是通过Native(理论上是微信客户端)做中转来处理或者转发信息,具体来说,就是Native分别在渲染层逻辑层注入WeixinJSBridge(微信内置浏览器私有接口),渲染层逻辑层可以与Native通信。
  • 微信内置浏览器私有接口WeixinJSBridge是微信浏览器的一个内置的JavaScript库,它提供了一系列的API,可以让网页调用微信客户端的功能。
  • WeixinJSBridge提供了渲染层NativeNative逻辑层之间消息通讯的机制。
  • 逻辑层和渲染层的通信会由 Native (微信客户端)做中转,逻辑层发送网络请求也经由 Native 转发。

为了保持与真实环境的一致,微信开发者工具没有新增或者删除WeixinJSBridge的方法,只是在WeixinJSBridge的基础上进行了方法的重构。

window.WeixinJSBridge = {on: c,invoke: e,publish: t,subscribe: o,
}
  • on:主要用来收集小程序开发者工具触发的事件回调。
  • invoke:以api的方式调用开发者工具提供的基础能力,并提供对应api执行后的回调
  • publish:主要用来向逻辑层发送信息,也就是说要调用逻辑层的事件方法
  • subscribe:主要用来收集逻辑层触发的事件回调,和publish配套,就像javascript中的发布订阅模式。

微信小程序的界面渲染的整体流程

在这里插入图片描述小程序的逻辑层和渲染层是分开的两个线程。在渲染层,宿主环境会把WXML转化成对应的JS对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的setData方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面。

小程序更新视图数据的通信流程

  1. 在渲染层把 WXML 转化成对应的 JS 对象。
  2. 在逻辑层发生数据变更的时候,通过宿主环境提供的 setData 方法把数据从逻辑层传递到 Native,再转发到渲染层。
  3. 经过对比前后差异,把差异应用在原来的 DOM 树上,更新界面。

界面渲染整体流
wxml 可以等价于一棵 DOM 树,另外也可以使用一个 js 对象来模拟 DOM 树,简称虚拟 DOM
1.在渲染层,宿主环境会把 WXML 转化成对应的j s 对象;
2.将 js 对象再次转成真实 DOM 树,交由渲染层线程渲染;
3.数据变化时,逻辑层提供最新的变化数据,js 对象发生变化比较进行 diff 算法对比;
4.将最新变化的内容反映到真实的 DOM 树中,更新界面;

会调用 WeixinJSBridge,将数据反馈给 视图层所以一次完整的用户事件可大致如下:
1、渲染层 -> Native (点击事件)
2、Native -> 逻辑层 (点击事件)
3、逻辑层 -> Native (setData)
4、Native -> 渲染层 (setData)

微信小程序的数据驱动的理解

在JS文件中的data中动态操控数据:使用 this.setData方法修改视图层data中的数据;
在wxml文件通过{{}}将数据绑定,即可在页面中显示

注意:
直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态,会导致数据不一致
仅支持可以JSON化的数据
单次设置的数据不能超过1024KB,尽量避免一次设置过多的数据
不要把data中的任何一项的value设为undefined,否则这一项将不能被设置,可能会有潜在的问题

微信小程序如何进行双向绑定?

  1. 通过bind-tap点击事件 向app.js 定义的方法中获取回执
  2. 设置data的值 实现双向绑定

微信小程序,为什么使用js闭包?

因为微信小程序处理函数是异步执行的,异步执行造成的结果可能和预期的不合,如果函数中有循环,最后的结果都一样,所以使用js闭包可以解决这个问题。

下篇笔记链接

【小程序八股文】系列之篇章三 | 小程序的事件及生命周期
下篇笔记链接:【待更新】
下篇笔记内容:【待更新】

原创笔记,未经同意请勿转载

码字不易

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Express 的 req 和 res 对象

新建 learn-express文件夹,执行命令行 npm init -y npm install express 新建 index.js const express require(express); const app express();app.get(/, (req, res, next) > {res.json(return get) })app.post(/, (req, res, next) > {res.json(retur…

论文精读-SRFormer Permuted Self-Attention for Single Image Super-Resolution

论文精读-SRFormer: Permuted Self-Attention for Single Image Super-Resolution SRFormer:用于单图像超分辨率的排列自注意 Params:853K,MACs:236G 优点: 1、参考SwinIR的RSTB提出了新的网络块结构PAB(排列自注意力…

sky walking日志采集以及注意事项

文章目录 1,sky walking日志采集功能概述2,采集log4j2日志3,采集logback日志4,效果展示5,注意事项 1,sky walking日志采集功能概述 在介绍Sky walking日志采集功能之前,最好在系统学习一遍日志…

【医学AI|顶刊精析|05-25】哈佛医学院·告别切片局限:3D病理如何革新癌症预后

小罗碎碎念 先打个预防针,我写这篇推文用了两个多小时,这就意味着要读懂这篇文章不太容易,我已经做好反复阅读的准备了。不过,风险之下,亦是机会,读懂的人少,这个赛道就越值得押宝。 在正式阅…

【C语言】8.C语言操作符详解(3)

文章目录 10.操作符的属性:优先级、结合性10.1 优先级10.2 结合性 11.表达式求值11.1 整型提升11.2 算术转换11.3 问题表达式解析11.3.1 表达式111.3.2 表达式211.3.3 表达式311.3.4 表达式411.3.5 表达式5: 11.4 总结 10.操作符的属性:优先级、结合性 …

基于Keras的手写数字识别(附源码)

目录 引言 为什么要创建虚拟环境,好处在哪里? 源码 我修改的部分 调用本地数据 修改第二层卷积层 引言 本文是博主为了记录一个好的开源代码而写,下面是代码出处!强烈建议收藏!【深度学习实战—1】&#xff1a…

【spring】@ControllerAdvice注解学习

ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解,用于定义一个全局的异常处理类或者说是控制器增强类(controller advice class)。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为,比…

ctfhub中的SSRF的相关例题(下)

目录 URL Bypass 知识点 相关例题 数字IP Bypass 相关例题 方法一:使用数字IP 方法二:转16进制 方法三:用localhost代替 方法四:特殊地址 302跳转 Bypass ​编辑 关于localhost原理: DNS重绑定 Bypass 知识点&…

ant design pro 6.0搭建教程

一、搭建 环境: Node.js 18.16.1 ant design pro 6.0 注意:选择umi3时,使用node.js 18版本的会报错,可以实践一下,这里就不再进行实践了。 umi3需要版本是低于node.js 18的 node下载地址: https://nodejs.…

可重构柔性装配产线,为智能制造领域带来了新的革命性变革

随着科技的飞速发展,个性化需求逐渐成为市场的主导。在这个充满变革的时代,制造业正面临着前所未有的挑战和机遇。如何快速响应市场需求、提高生产效率、保证产品质量,成为每一家制造企业必须思考的问题。 在这样的背景下,富唯智…

免费插件集-illustrator插件-Ai插件-文本对象和文本段落互转

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行文本对象和文本段落互转。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

00.OpenLayers快速开始

00OpenLayers快速开始 官方文档: 快速开始:https://openlayers.org/doc/quickstart.html 需要node环境 一、设置新项目 npm create ol-app my-app cd my-app npm start第一个命令将创建一个名为 my-app​ 的目录(如果您愿意,…

Java——简易图书管理系统

本文使用 Java 实现一个简易图书管理系统 一、思路 简易图书管理系统说白了其实就是 用户 与 图书 这两个对象之间的交互 书的属性有 书名 作者 类型 价格 借阅状态 而用户可以分为 普通用户 管理员 使用数组将书统一管理起来 用户对这个数组进行操作 普通用户可以进…

有趣的css - 圆形背景动效多选框

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是用 css 实现一个圆形背景动效多选框,适用提醒用户勾选场景,突出多选框选项,可以有效增加用户识别度。 最新文章通过公众号「设计师工作日常」发布…

VBA批量合并带有图片、表格与文本框的Word

本文介绍基于VBA语言,对大量含有图片、文本框与表格的Word文档加以批量自动合并,并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符(https://blog.csdn.net/zhebu…

helloworld 可执行程序得到的过程

// -E 预处理 开发过程中可以确定某个宏 // -c 把预处理 编译 汇编 都做了,但是不链接 // -o 指定输出文件 // -I 指定头文件目录 // -L 指定链接库文件目录 // -l 指定链接哪一个库文件 #include <stdio.h> #include <stdlib.h> #include <string.h>int mai…

【微积分】CH16 integrals and vector fields听课笔记

【托马斯微积分学习日记】13.1-线积分_哔哩哔哩_bilibili 概述 16.1line integrals of scalar functions [中英双语]可视化多元微积分 - 线积分介绍_哔哩哔哩_bilibili 16.2vector fields and line integrals&#xff1a; work circulation and flux 向量场差不多也是描述某种…

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…

Leetcode刷题笔记1:数组基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录数组基础1部分的题目&#xff0c;主要题目包括&#xff1a; Leetcode 704 二分查找Leetcode 27 移除元素 知识点 二分查找 原理 二分查找的适用对象为有序数组且数组中无重复元素&#xff0c;其主要原理是每次都从有序…

AI视频教程下载:全面掌握ChatGPT和LangChain开发AI应用(附源代码)

这是一门深入的课程&#xff0c;涉及ChatGPT、LangChain和Python。打造专注于现实世界AI集成的AI应用&#xff0c;课件附有每一节涉及到的源代码。 **你将学到什么&#xff1a;** - 将ChatGPT集成到LangChain的生产风格应用中 - 使用LangChain组件构建复杂的文本生成管道 - …