微信小程序底层框架实现原理:开篇-双线程架构

这篇具有很好参考价值的文章主要介绍了微信小程序底层框架实现原理:开篇-双线程架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序底层框架实现原理 - 夜还不够黑丶 - 掘金小册

前言

介绍章节我们聊了一下“小程序”的一些概念和发展历程,并且拓展了一下思路。我们从本章节开始讲解小程序的架构。

本章节分解如下:

  • 小程序的双线程架构设计。
  • 双线程对比单线程的优势在哪里。
  • 传统h5开发环境有什么弊端。
  • Native层在双线程架构中起到怎样的作用。
  • 如何解决传统h5的安全管控问题

双线程模型

小程序的架构模型有别与传统web单线程架构,小程序为双线程架构。

微信小程序的渲染层与逻辑层分别由两个线程管理,渲染层的界面使用 webview 进行渲染;逻辑层采用 JSCore运行JavaScript代码。这里先看一下小程序的架构图。

小程序线程模型,微信小程序,架构,小程序,前端框架,javascript,ecmascript,前端

可以从图中看出,由于渲染层与逻辑层分开,一个小程序有多个界面,所以渲染层对应存在多个webview。这两个线程之间由Native层进行统一处理。无论是线程之间的通讯、数据的传递、网络请求都由Native层做转发。

那么首先有一个问题需要解释,这里的webview是什么呢?

平常我们浏览网页都是在浏览器中,可以想象webview是一个嵌入式的浏览器,是嵌入在原生应用中的。webview 用来展示网页的 view 组件,该组件是你运行自己的浏览器或者在你的线程中展示线上内容的基础。使用 webkit 渲染引擎来展示,并且支持前进后退、浏览历史、放大缩小、等更多功能。

简单来说 webview 是手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装的一个组件。不过没有提供地址栏和导航栏,只是单纯的展示一个网页界面。

这里比较容易弄混的概念是iframeiframe为页面中嵌入页面的方式,有别于webview嵌入原生应用的概念,这里需要注意一下。

紧接上文架构,那么为什么要做多个webview呢,为了更加接近原生应用APP的用户体验。多个webview可以理解为多页面应用,有别于单页面应用SPASPA渲染页面是通过路由识别随后动态将页面挂载到root节点中去,如果单页面应用打开一个新的页面,需要先卸载掉当前页面结构,并且重新渲染。很显然原生APP并不是这个样子,比较明显的特征为从页面右侧向左划入一个新的页面,并且我们可以同时看到两个页面。

小程序线程模型,微信小程序,架构,小程序,前端框架,javascript,ecmascript,前端

多页面应用就很好达到这个效果,新页面直接滑动出来并且覆盖在旧页面上即可,这也是小程序现在所做的形式。这样的用户体验是非常好的。

如果从这个出发点进行探究,如果我们来做大概率会遇到哪些问题呢?我首先想到的是静态资源问题。

稍微回忆一下单线程架构,传统html开发的时候,官方建议script加载js的时候放在Body下方位置。就像下图。

小程序线程模型,微信小程序,架构,小程序,前端框架,javascript,ecmascript,前端

为什么建议在下方插入script呢,就是因为单线程阻塞问题。因为html文件是从上到下渲染的,如果中间插入js的话,则会中断HTML节点渲染,转而去执行jsjs执行完后继续渲染节点。就是因为单线程阻塞问题才建议在下方插入script,并且配合window.onload可以拿到已经渲染完成的节点。

这种情况当然也可以通过一些手段来规避,比如asyncdefer等。这两个属性加上后,虽然不会阻塞DOM渲染,但是并不是根本上解决问题,而是合理地安排了资源解析而已。

单线程阻塞问题还没结束,另一个问题又扑面而来。如果所有资源都是通过请求来获取,那么不光会阻塞js解析的时间,还要加上js请求的时长。请求js资源时间不可控,怎么办呢。这个时候另一种选择就至关重要,就是缓存。

微信中这一点做的很好,就是WXSDK,微信SDK是一系列jsApi的集合,提供了微信的丰富原生能力和微信内部的方法。

在曾经开发微信公众号h5的时候我们需要手动的注入某个版本的微信SDK到自身的项目中去,这种方式的用户体验并不是很好,因为加载js,并且解析js逻辑的时候是会抢占渲染资源的,原因也就是上面刚讲过的单线程阻塞问题,如果在我们有承接平台的时候,比如微信客户端,将微信SDK这样的资源放在客户端Native中,在加载页面的时候再进行动态的注入,由Native层注入到视图层。这样的做法的好处很明显,首先会使包的体积变小,其次,减少了网络请求的发送。

小程序中也用到了微信SDK,当然不仅仅只有微信SDK做了这样的处理,由Native层注入到双线程中。还有底层基础库Service等都是事先放在Native层中的,当页面进行加载的时候再进行动态的注入。

好比如说公司里给你配了一台电脑来开发项目一样,曾经工作人员都需要自己带着自身的开发工具去公司上班,如果公司统一配好了开发工具,那么你再也不用带着电脑去公司上班了,减少了每个员工为工作需要提前准备的资源。

可以看出,双线程的好处不仅仅是一分为二而已,还有强大的Native层做背后支撑。

Native层除了做一些资源的动态注入,还负责着很多的事情,请求的转发,离线存储,组件渲染等等。界面主要由成熟的 Web 技术渲染,辅之以大量的接口提供丰富的客户端原生能力。同时,每个小程序页面都是用不同的WebView去渲染,这样可以提供更好的交互体验,更贴近原生体验,也避免了单个WebView的任务过于繁重。此外,界面渲染这一块还定义了一套内置组件以统一体验,并且提供一些基础和通用的能力,进一步降低开发者的学习门槛。值得一提的是,内置组件有一部分较复杂组件是用客户端原生渲染的,以提供更好的性能。

有了这么一个靠山后,让逻辑层与渲染层更加专注于自身的责任。

换一个角度来思考,基于Web 技术来渲染小程序是存在一些不可控因素和安全风险的。这是因为Web技术是非常开放灵活的,我们可以利用JavaScript 脚本随意地跳转网页或者改变界面上的任意内容。

这个时候安全问题摆到了微信团队的台面上。

如果微信小程序可以离线浏览,只需要小程序开发者把一些应用数据缓存到本地,然后通过javascript脚本把小程序渲染的webview跳转到其他的在线网页,那么这个体验就非常的糟糕。想必前端开发者会非常熟悉这个操作。

除此之外,javascript还可以通过操作DOM,直接获取小程序内部的一些敏感数据,比如用户的信息,商家信息等等,那么小程序将毫无安全可言。

为了解决安全管控问题,小程序阻止开发者使用一些浏览器提供的比如跳转页面、操作DOM、动态执行脚本的开放性接口。如果这些东西一个一个地去禁用,那么势必会进入一个糟糕的循环,因为javascript实在是太灵活了,浏览器的接口也太丰富了,很容易就遗漏一些危险的接口,而且就算是禁用掉了所有感觉到危险的接口,也势必防不住浏览器内核的下次更新。指不定又会出现一些漏洞。

因此,要彻底解决这个问题,必须提供一个沙箱环境来运行开发者的JavaScript 代码。这个沙箱环境不能有任何浏览器相关接口,只提供纯JavaScript 的解释执行环境,那么像HTML5中的ServiceWorkerWebWorker特性就符合这样的条件,这两者都是启用另一线程来执行 javaScript。但是考虑到小程序是一个多 webView 的架构,每一个小程序页面都是不同的webView 渲染后显示的,在这个架构下不好去用某个webView中的ServiceWorker去管理所有的小程序页面。

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

后面的章节将微信小程序中的架构及设计思想拆分来讲解,下章节将从WXML表层结构设计由浅入深的讲解渲染线程。文章来源地址https://www.toymoban.com/news/detail-842729.html

到了这里,关于微信小程序底层框架实现原理:开篇-双线程架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 结合若依框架实现微信小程序授权登录

    通过若依框架实现微信小程序的授权登录。 原视频链接: https://www.bilibili.com/video/BV1iM411E7RE/?spm_id_from=333.337.search-card.all.clickvd_source=c15794e732e28886fefab201ec9c6253 下载 ruoyi-vue 代码 https://gitee.com/y_project/RuoYi-Vue 下载 ruoyi-app 代码 https://gitee.com/y_project/RuoYi-App 流程图如下: app 模块配

    2023年04月25日
    浏览(29)
  • [计网底层小探索]:实现并部署多线程并发Tcp服务器框架(基于生产者消费者模型的线程池结构)

    网络层与传输层 内置于操作系统的内核中 ,网络层一般使用 ip 协议,传输层常用协议为 Tcp 协议和 Udp 协议, Tcp 协议和 Udp 协议拥有各自的特点和应用场景: sockaddr_in 结构体用于存储网络通信主机进程的 ip 和端口号等信息 小项目的完整文件的gittee链接 Tcp 服务器架构: 序列反序列

    2024年02月22日
    浏览(27)
  • 基于java中的SSM框架+微信小程序实现教务系统小程序项目演示【附项目源码】

    基于java中的SSM框架+微信小程序实现教务系统小程序演示 JAVA语言是目前软件市场上应用最广泛的语言开发程序。可以在多种平台上运用的,兼容性比较强,适应市面上大多数操作系统,不会出现乱码的现像,其扩展性和维护性都更好,具有分析问题和解决问题的能力,是面向

    2024年04月15日
    浏览(51)
  • 25.Java程序设计-基于SSM框架的微信小程序校园求职系统的设计与实现

    1. 引言 1.1 背景 介绍校园求职系统的背景,说明为什么设计这个系统以及系统的重要性。 1.2 研究目的 阐述设计基于SSM框架的微信小程序校园求职系统的目标和意义。 2. 需求分析 2.1 行业背景 分析校园求职行业的特点和需求,以及目前市场上同类系统的不足之处。 2.2 用户需

    2024年02月04日
    浏览(38)
  • 10.Java程序设计-基于SSM框架的微信小程序家教信息管理系统的设计与实现

    摘要是论文的开篇,用于简要概述研究的目的、方法、主要结果和结论。以下是一个简化的摘要示例,你可以根据实际情况进行修改和扩展: 摘要 随着社会的发展和教育需求的增长,家教服务作为一种个性化的学习方式受到了广泛关注。为了更好地满足家教市场的需求,本

    2024年02月03日
    浏览(43)
  • 【附源码】基于flask框架基于微信小程序的二手电商平台设计与实现 (python+mysql+论文)

    本系统(程序 + 源码)带文档 lw 万字以上   文末可获取本课题的源码和程序 选题背景: 随着互联网的高速发展,电子商务已经成为人们生活中不可或缺的一部分。特别是近年来,微信小程序以其便捷性和高效性,迅速在电商领域崭露头角。然而,尽管电商平台如雨后春笋般

    2024年04月13日
    浏览(45)
  • SpringCloud微服务实战——搭建企业级开发框架:第三方登录-微信小程序授权登录流程设计和实现

      在前面的设计和实现中,我们的微服务开发平台通过JustAuth来实现第三方授权登录,通过集成公共组件,着实减少了很多工作量,大多数的第三方登录直接通过配置就可以实现。而在第三方授权登录中,微信小程序授权登录和APP微信授权登录是两种特殊的第三方授权登录

    2024年02月07日
    浏览(40)
  • php+mysql的基于微信小程序的企业装修平台的设计与实现 TP框架(附源码 调试 讲解 文档)

    随着移动互联网的普及,传统的装修行业逐渐向互联网装修转型。微信小程序作为一种新型的应用形态,凭借其便捷性、易用性和普及性,成为了企业装修平台开发的首选。本文旨在设计和实现一个基于微信小程序的企业装修平台,通过公司展示、案例展示、设计师展示、在

    2024年02月05日
    浏览(38)
  • 微信小程序--小程序框架

    目录 前言:  一.框架基本介绍 1.整体结构: 2.页面结构: 3.生命周期: 4.事件系统: 5.数据绑定: 6.组件系统: 7.API: 8.路由: 9.模块化: 10.全局配置: 二.视图层详解 1.WXML(WeiXin Markup Language): 1.1 列表渲染 1.2条件渲染 1.3 模板 2.WXSS(WeiXin Style Sheet): 3.数据绑定: 5

    2024年02月08日
    浏览(39)
  • 线程池ThreadPoolExecutor底层原理源码分析

    ThreadPoolExecutor中提供了两种执行任务的方法: void execute(Runnable command) Future? submit(Runnable task) 实际上submit中最终还是调用的execute()方法,只不过会返回⼀个Future对象,用来获取任务执行结果: execute(Runnable command)方法执行时会分为三步: 注意:提交⼀个Runnable时,不管当前线程

    2024年02月06日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包