微信小程序实现原理

微信小程序采用wxmlwxssjavascript进行开发,本质是一个单页应用,所有的页面渲染和事件处理,都在一个页面内进行,但又可以通过微信客户端调用原生的各种接口。微信的架构,是数据驱动视图的MVVM模式,其视图UI和数据是分离的,所有的页面更新,都需要通过对数据的变更来实现。小程序分为两个部分WebviewAppServiceWebview主要用来展现渲染界面,AppService用来处理业务逻辑、数据及接口调用,通过系统层JSBridge实现通信,实现UI的渲染与事件的处理。

目录结构

打包前

Project
├── pages
│ ├── index
│ │ ├── index.js // index 逻辑
│ │ ├── index.json // index 配置
│ │ ├── index.wxml // index 结构
│ │ └── index.wxss // index 样式表
│ └── logs
│ ├── logs.js // logs 逻辑
│ ├── logs.json // logs 配置
│ ├── logs.wxml // logs 结构
│ └── logs.wxss // logs 样式表
├── app.js // 逻辑
├── app.json // 公共配置
├── app.wxss // 公共样式表
├── project.config.json // 项目配置
└── sitemap.json // 页面收录配置

打包后

Project
├── app-config.json // 小程序工程全部json配置信息
├── app-service.js // JS业务逻辑打包到此处
├── page-frame.html // 视图的模板文件
└── pages
├── index.html // index 页面
└── logs.html // logs 页面

架构方案

微信小程序的框架包含两部分View视图层与AppService逻辑层,View层用来渲染页面结构,AppService层用来逻辑处理、数据请求、接口调用,它们在两个进程里运行,具体实现是在两个Webview中运行。

视图层和逻辑层通过系统层的JSBridge进行通信,逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层把触发的事件通知到逻辑层进行业务处理。

-----------------------                           -----------------------
| View | | AppService |
| | | |
| Page1 Page2 Page3 | | Manager Api |
----------------------- -----------------------
| ↑ | ↑
| Event | Data | Data | Event
↓ | ↓ |
-------------------------------------------------------------------------
| JSBridge |
| |
| Native Storage Network ... |
-------------------------------------------------------------------------

微信将所有的视图都将加载到一个Webview中,称之为View层。将所有进行逻辑处理的JS代码全部加载到另一个WebView中,称之为AppService层,每个小程序只有一个并且整个生命周期常驻内存。在JSBridge中封装了消息通信以及通过App访问OS能力的实现,对于消息通信通过在不同平台调用相应的方法进行通信,开发环境为window.postMessage, IOS下为WKWebviewwindow.webkit.messageHandlers.invokeHandler.postMessageAndroid下为WeixinJSCore.invokeHandler。在Js引擎方面,Android中使用X5内核,IOS中使用JavaScriptCore引擎,开发工具中使用nwjs Chrome内核。

通过使用View视图层与AppService逻辑层就实现了双线程的小程序运行方案,通过两个线程,可以做到将代码放入沙箱执行,从而做到对于代码执行的安全与管控,当然对于双线程只是一个小程序的解决方案,倘若要在一个App上运行多个小程序,就应该采用多线程方案去执行,不仅是对于性能方面的考虑,也是为了防止小程序之间相互影响。

底层支持

微信小程序开发工具中拥有一些编译支持模板以及小程序底层支持文件。

  • transWxmlToJs: wxmljs
  • transWxssToCss: wxsscss
  • transConfigToPf: 模板页配置
  • transWxmlToHtml: wxmlhtml
  • transManager: 管理器
  • WAConsole.js: 框架JS库,控制台能力
  • WAWebview.js: 框架JS库,提供视图层基础的API能力,主要功能有将消息通信封装为JSBridge消息,日志组件Reporter封装,wx对象下部分渲染视图方面的Api,小程序组件实现和注册,VirtualDOMdiffRender UI的实现,页面事件触发处理
  • WAService.js: 框架JS库,提供逻辑层基础的API能力,主要功能有消息通信封装为JSBridge消息,日志组件Reporter封装,wx对象下面的大部分Api方法,App()小程序入口,Page()页面的入口,getApp等全局方法,数据绑定,事件分发,生命周期管理,路由管理,模块化能力等

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://www.zhihu.com/question/50920642
https://kangzubin.com/wxapp-decompile-1/
https://github.com/berwin/Blog/issues/49
https://segmentfault.com/a/1190000018631528
http://eux.baidu.com/blog/fe/微信小程序架构原理
https://juejin.im/post/5da444ab6fb9a04e054d93d8
https://cloud.tencent.com/developer/article/1029663

微信小程序实现原理的更多相关文章

  1. 微信小程序底层原理与运行机制类文章学习

    参考文档 小程序底层实现原理及一些思考 为了安全和管控, 双线程执行 Web Worker执行用户的代码; UI线程执行大部分的功能. 微信小程序架构原理 只通过mvvm模板语法动态改变页面, 不支持 ...

  2. 在线制作一键生成微信小程序实现原理之需求分析

    随着微信小程序接口不断的放开,小程序在今年或许是明年必将成为商家的一个标配,这个标配的标准就是要开发周期短,费用低,功能实用.只有这样才能让线下的广大商家快速接入.现在也有好多公司开发出了一键生成快速 ...

  3. 来自于微信小程序的一封简讯

    9月21晚间,微信向部分公众号发出公众平台-微信应用号(小程序)的内测邀请,向来较为低调的微信在这一晚没人再忽视它了. 来自个人博客:Damonare的个人博客 一夜之间火了的微信应用号你真的知道吗? ...

  4. 微信小程序:原生热布局终将改变世界

    关于本文的所有观点都是网上收集,与作者本人没有任何关系! 最近朋友圈已经被微信小程序刷屏了,这也难怪,腾讯的产品拥有广泛的影响力,谁便推出个东西,都会有很多人认为会改变世界,这不,张小龙刚一发布微信小 ...

  5. 教你理解微信小程序的生命周期和运行原理

    转自:http://blog.csdn.net/tsr106/article/details/53052879  写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君 ...

  6. 从session原理出发解决微信小程序的登陆问题

    声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/9127416.html  原理知识准备  对于已经熟悉了session原理的同 ...

  7. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  8. 理解微信小程序的生命周期和运行原理

    写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君公众号带你学习小程序的生命周期和运行原理. 小程序由两大线程组成:负责界面的线程(view thread)和服务线 ...

  9. 【转】微信小程序原理

    微信小程序原理 kamidox 关注 2016.11.05 09:42* 字数 2356 阅读 14621评论 5喜欢 75赞赏 1 微信小程序使用了前端技术栈 JavaScript/WXML/WXS ...

  10. 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计

    使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...

随机推荐

  1. 梳理Langchain-Chatchat知识库API接口

    一.Langchain-Chatchat 知识库管理 1.Langchain-Chatchat 对话和知识库管理界面   Langchain-Chatchat v0.28 完整的界面截图,如下所示: ...

  2. IBM java的分析工具(ga和ha)学习和整理

    IBM java的分析工具(ga和ha)学习和整理 背景 前几天学习了整理了 jca 工具 今天继续学习一下 ga工具 ga 工具主要是分析gclog相关. 可以很直观的进行gclog的分析和展示. ...

  3. [转帖]TiKV & TiFlash 加速复杂业务查询

    https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tikv-tiflash 背景​ 在互联网公司或传统公司的 CRM 系统中,最常用的功 ...

  4. [转帖]jmeter必备正则表达式

    元字符 .  注意是一个点号,表示匹配任意单个字符 \d 表示匹配任意单个数字 [0-9] 等价于0-9 [a-zA-Z] 等价于所有的大小写字母 限定符 +  加号,表示匹配至少大于1次(1次或多次 ...

  5. [转帖]【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

    目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数: FIO结果说明 I/O 的重放('录'下实际工况的IO,用fio'重放') fio工作参数可以写入配置文 ...

  6. 使用buildx在x86机器上面编译arm64架构的Docker镜像

    buildx 多架构编译 安装docker 下载docker 下载buildx 安装架构支持 docker run --privileged --rm tonistiigi/binfmt --inst ...

  7. [转帖]020 Linux 20 个宝藏命令案例

    https://my.oschina.net/u/3113381/blog/5478108 1 JDK 相关的查找命令 (1)确认是否安装 JDK //命令 java -version //输出示例 ...

  8. mysql8 部分信息总结

    0. 我这边环境需要的配置参数 datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-error=/var/log/mysqld.logp ...

  9. It is currently in use by another Gradle instance

    FAILURE: Build failed with an exception. * What went wrong: Could not create service of type TaskHis ...

  10. vue中设置props参数类型

    props参数的使用 在使用vue的项目开发的过程中 经常会定义大量的组件使用 这个时候组件中的定义的数据类型就非常重要了 此时我们需要定义组件中需要的数据类型 之前我只知道简单的几个 今天忽然发现原 ...