微信小程序-底层框架-开发文档学习笔记

查看更多学习笔记:GitHub:LoveEmiliaForever
微信小程序开发指南
微信小程序开发文档

双线程模型

小程序是基于双线程模型的,在这个模型中,小程序的逻辑层与渲染层分开在不同的线程运行

技术选型

在对小程序的架构设计时的要求只有一个,就是要快,包括要渲染快、加载快等
我们期望体验到的是只有很短暂的加载界面,在一个过渡动画之后可以马上看到小程序的主界面

渲染界面的技术
使用纯客户端原生技术或纯 Web 技术都有各自的缺点,那如果使用两者结合起来的 Hybrid 技术来渲染小程序,能否优于各自独立渲染的技术方案呢
最终,我们选择类似于微信 JSSDK 这样的 Hybrid 技术,即界面主要由成熟的 Web 技术渲染,辅之以大量的接口提供丰富的客户端原生能力
同时,每个小程序页面都是用不同的WebView去渲染,这样可以提供更好的交互体验,更贴近原生体验,也避免了单个WebView的任务过于繁重

管控与安全

基于Web 技术来渲染小程序是存在一些不可控因素和安全风险的,这是因为Web技术是非常开放灵活的
为了解决管控与安全问题,我们必须阻止开发者使用一些浏览器提供的,诸如跳转页面、操作DOM、动态执行脚本的开放性接口
要彻底解决这个问题,我们必须提供一个沙箱环境来运行开发者的JavaScript 代码

得益于客户端系统有JavaScript 的解释引擎(在iOS下是用内置的 JavaScriptCore框架,在安卓则是用腾讯x5内核提供的JsCore环境)
我们可以创建一个单独的线程去执行 JavaScript,在这个环境下执行的都是有关小程序业务逻辑的代码,也就是我们前面一直提到的逻辑层
而界面渲染相关的任务全都在WebView线程里执行,通过逻辑层代码去控制渲染哪些界面,那么这一层当然就是所谓的渲染层

天生的延时

小程序是基于双线程模型,那就意味着任何数据传递都是线程间的通信,也就是都会有一定的延时
由于这个原因,在小程序架构里,很多操作都会变成异步

异步会使得各部分的运行时序变得复杂一些
逻辑层与渲染层需要有一定的机制保证时序正确,这些工作在小程序框架里会处理好

除了逻辑层与渲染层之间的通信有延时,各层与客户端原生交互同样是有延时的
注册给逻辑层有关客户端能力的接口,实际上也是跟微信主线程之间的通信,同样意味着有延时
这也是大部分提供的接口都是异步的原因

组件系统

小程序的视图是在WebView里渲染的,那搭建视图的方式自然就需要用到HTML语言
我们设计一套组件框架——Exparser,基于这个框架,内置了一套组件,以涵盖小程序的基础功能,便于开发者快速搭建出任何界面
同时也提供了自定义组件的能力,开发者可以自行扩展更多的组件,以实现代码复用

Exparser框架

Exparser是微信小程序的组件组织框架,内置在小程序基础库中,为小程序的各种组件提供基础的支持
Exparser会维护整个页面的节点树相关信息,包括节点的属性、事件绑定等,相当于一个简化版的Shadow DOM实现
小程序中,所有节点树相关的操作都依赖于Exparser,包括WXML到页面最终节点树的构建、createSelectorQuery调用和自定义组件特性等

内置组件

基于Exparser框架,内置了一套组件,提供了视图容器类、表单类、导航类、媒体类、开放类等几十种组件
一般而言,我们会把一个组件内置到小程序框架里的一个重要原则是:这个组件是基础的

自定义组件

自定义组件是开发者可以自行扩充的组件,开发者可以将常用的节点树结构提取成自定义组件,实现代码复用

ShadowTree的概念
组件的节点树称为ShadowTree,即组件内部的实现
最终拼接成的页面节点树被称为Composed Tree,即将页面所有组件节点树合成之后的树
各个组件也将具有各自独立的逻辑空间,每个组件都分别拥有自己的独立的数据、setData调用

运行原理
在使用自定义组件的小程序页面中,Exparser将接管所有的自定义组件注册与实例化

  • 小程序基础库提供有Page和Component两个构造器
  • (以Component为例)小程序启动时,构造器会将开发者设置的properties、data、methods等定义段,写入Exparser的组件注册表中
  • 这个组件在被其它组件引用时,就可以根据这些注册信息来创建自定义组件的实例
  • Page构造器的大体运行流程与之相仿,每个页面有一个与之对应的组件,称为页面根组件

组件创建的过程大致有以下几个要点

  1. 根据组件注册信息,从组件原型上创建出组件节点的JS对象,即组件的this
  2. 将组件注册信息中的data 复制一份,作为组件数据,即this.data
  3. 将这份数据结合组件WXML,据此创建出Shadow Tree,由于Shadow Tree中可能引用有其他组件,因而这会递归触发其他组件创建过程
  4. 将ShadowTree拼接到Composed Tree上,并生成一些缓存数据用于优化组件更新性能
  5. 触发组件的created生命周期函数
  6. 如果不是页面根组件,需要根据组件节点上的属性定义,来设置组件的属性值
  7. 当组件实例被展示在页面上时,触发组件的attached 生命周期函数,如果Shadw Tree中有其他组件,也逐个触发它们的生命周期函数

组件间通信
不同组件实例间的通信有WXML属性值传递、事件系统、selectComponent和relations等方式
WXML属性值传递是从父组件向子组件的基本通信方式,而事件系统是从子组件向父组件的基本通信方式
在ShadowDOM体系中,冒泡事件还可以划分为在Shadow Tree上冒泡的事件和在Composed Tree上冒泡的事件
在自定义组件中使用triggerEvent触发事件时,可以指定事件的bubbles、composed和capturePhase属性,用于标注事件的冒泡性质

Component({methods: {helloEvent: function() {this.triggerEvent('hello', {}, {bubbles: true,      // 这是一个冒泡事件composed: true,     // 这个事件在Composed Tree 上冒泡capturePhase: false // 这个事件没有捕获阶段})}}
})

原生组件

在内置组件中,有一些组件较为特殊,它们并不完全在Exparser的渲染体系下,而是由客户端原生参与组件的渲染,这类组件我们称为原生组件

原生组件运行机制

  • 组件被创建,包括组件属性会依次赋值。
  • 组件被插入到DOM树里,浏览器内核会立即计算布局,此时我们可以读取出组件相对页面的位置(x, y坐标)、宽高。
  • 组件通知客户端,客户端在相同的位置上,根据宽高插入一块原生区域,之后客户端就在这块区域渲染界面
  • 当位置或宽高发生变化时,组件会通知客户端做相应的调整

原生组件在WebView这一层的渲染任务是很简单,只需要渲染一个占位元素,之后客户端在这块占位元素之上叠了一层原生界面
因此,原生组件的层级会比所有在WebView层渲染的普通组件要高

原生组件好处

  • 扩展Web的能力,比如像输入框组件(input, textarea)有更好地控制键盘的能力。
  • 体验更好,同时也减轻WebView的渲染工作
  • 绕过setData、数据通信和重渲染流程,使渲染性能更好

常见原生组件
在这里插入图片描述

交互比较复杂的原生组件都会提供context,用于直接操作组件

原生组件渲染限制

原生组件脱离在WebView渲染流程外,这带来了一些限制
一些CSS样式无法应用于原生组件
最为常见的问题是,原生组件会浮于页面其他组件之上(相当于拥有正无穷大的z-index值)使其它组件不能覆盖在原生组件上展示
可以考虑使用cover-view和cover-image组件。这两个组件也是原生组件,同样是脱离WebView的渲染流程外,而原生组件之间的层级就可以按照一定的规则控制

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv7代码解读[02] cfg/training/yolov7.yaml解读

ELAN结构 MP结构 SPPCSPC结构 ELAN-H结构 # parameters nc: 80 # number of classes depth_multiple: 1.0 # model depth multiple width_multiple: 1.0 # layer channel multiple# anchors anchors:- [12,16, 19,36, 40,28] # P3/8- [36,75, 76,55, 72,146] #…

UnityWebGL UGUI中文不显示问题

这是Unity编辑中效果 打包成webgl后的效果(中文没有显示出来) 解决方法 将Unity默认使用的Arial替换成中文字体。 1.找到电脑字体库(win电脑字体库路径:C:\Windows\Fonts ;Mac电脑搜索“字体册”)。 2.将…

大数据职业技术培训包含哪些

技能提升认证考试,旨在通过优化整合涵盖学历教育、职业资格、技术水平和高新技术培训等各种教育培训资源,通过大数据行业政府引导,推进教育培训的社会化,开辟教育培训新途径,围绕大数据技术人才创新能力建设&#xff0…

【GPTs分享】每日GPTs分享之Image Generator Tool

今日GPTs分享:Image Generator Tool。Image Generator Tool是一种基于人工智能的创意辅助工具,专门设计用于根据文字描述生成图像。这款工具结合了专业性与友好性,鼓励用户发挥创造力,同时提供高效且富有成效的交互体验。 主要功能…

Vue.js+SpringBoot开发校园失物招领管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系统公告模块2.4 感谢留言模块 三、界面展示3.1 登录注册3.2 招领模块3.3 寻物模块3.4 公告模块3.5 感谢留言模块3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 校园失物招领…

【51单片机】红外遥控红外遥控电机调速(江科大)

1.红外遥控简介 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工,异步 红外LED波长:940nm 通信协议标准:NEC标准 2.硬件电路 红外发送部分 IN高电平时,LED不亮,IN低电平时&…

STM32学习3 寄存器映射和GPIO寄存器编程

STM32学习3 寄存器映射和GPIO寄存器编程 一、STM32外设内存空间1. 内存空间划分2. 区域功能说明(1)block0(2)block1(3)block2(4)block3~4(5)block5&#xff0…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁&#xff0c;并引入了一个新的问题 若定义锁的过期时间是10s&#xff0c;此时A线程获取了锁然后执行业务代码&#xff0c;但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码&#xff0c;A线程…

vue中循环多个li(表格)并获取对应的ref

有种场景是这样的 <ul><li v-for"(item,index) in data" :key"index" ref"???">{{item}}</li> </ul> //key值在项目中别直接用index&#xff0c;最好用id或其它关键值const data [1,2,3,4,5,6]我想要获取每一个循环并…

华为云是什么

公有云配置 区域&#xff1a; 同一个区域中的云主机是可以互相连通的&#xff0c;不通区域云主机是不能使用内部网络互相通信的 选择离自己比较近的区域&#xff0c;可以减少网络延时卡顿 华为云yum仓库&#xff1a;https://repo.huaweicloud.com/rockylinux/ 首先完成跳板机的…

【linux进程信号(一)】信号的概念以及产生信号的方式

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程信号 1. 前言2. 信号的基…

亿道推出重磅加固平板!为行业发展注入新动力

随着科技生产力的不断发展&#xff0c;各行各业都得到质的飞跃。产品的迭代速度也大大加快&#xff0c;作为全球领先的加固行移动终端一站式提供商&#xff0c;亿道信息跟紧时代潮流&#xff0c;推出EM-I10J、EM-I20J两款均衡型加固平板&#xff0c;为行业发展注入新动力。 接地…

YOLOv8 DeepSORT实现智能交通监控-改进yolo单目测距及速度测量-流量计数

YOLOv8&#xff1a;目标检测算法详解 YOLO&#xff08;You Only Look Once&#xff09;系列是一种单阶段、实时的目标检测框架&#xff0c;其最新迭代版本YOLOv8继承并优化了前代YOLO在速度与精度上的优势。YOLOv8的核心思想在于将整幅图像一次性输入到神经网络中&#xff0c;直…

dpdk协议栈之udp架构优化

dpdk优势 传统网络架构与 DPDK&#xff08;Data Plane Development Kit&#xff09;网络架构之间存在许多区别&#xff0c;而 DPDK 的优势主要体现在以下几个方面&#xff1a; 数据包处理性能&#xff1a;传统网络架构中&#xff0c;网络数据包的处理通常由操作系统的网络协议…

【学习笔记】Serdes中的高速接口设计

参考文献&#xff1a; 一、绪论 1.1 背景 “串行替代并行”&#xff1a; 串行传输使用差分信号传输以传输更长距离&#xff1b; 并行传输因串扰无法长距离传输&#xff1b;并行线路对信号偏斜量的要求&#xff0c;限制了最大的传输速率。 SerDesSerializer Deserializer S…

2024程序员容器化上云之旅-第2集-Ubuntu-WSL2-Windows11版:接近深洞

故事梗概 Java程序员马意浓在互联网公司维护老旧电商后台系统。 渴望学习新技术的他在工作中无缘Docker。 他开始自学Vue3并使用SpringBoot3完成了一个前后端分离的Web应用系统&#xff0c;并打算将其用Docker容器化后用K8s上云。 3 挑选工具 马意浓画好架构图后&#xff…

基于yolov5的行人跌倒检测,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的行人跌倒检测系统&#xff0c;支持图像检测&#xff0c;视屏检测和摄像头检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的行人跌倒检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目&#xff0c;包括代…

蜣螂优化算法DBO求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09; 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得…

vue2、vue3各自的响应式原理

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…