微信小程序实现原理

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

目录结构

打包前

  1. Project
  2. ├── pages
  3. ├── index
  4. ├── index.js // index 逻辑
  5. ├── index.json // index 配置
  6. ├── index.wxml // index 结构
  7. └── index.wxss // index 样式表
  8. └── logs
  9. ├── logs.js // logs 逻辑
  10. ├── logs.json // logs 配置
  11. ├── logs.wxml // logs 结构
  12. └── logs.wxss // logs 样式表
  13. ├── app.js // 逻辑
  14. ├── app.json // 公共配置
  15. ├── app.wxss // 公共样式表
  16. ├── project.config.json // 项目配置
  17. └── sitemap.json // 页面收录配置

打包后

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

架构方案

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

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

  1. ----------------------- -----------------------
  2. | View | | AppService |
  3. | | | |
  4. | Page1 Page2 Page3 | | Manager Api |
  5. ----------------------- -----------------------
  6. | |
  7. | Event | Data | Data | Event
  8. | |
  9. -------------------------------------------------------------------------
  10. | JSBridge |
  11. | |
  12. | Native Storage Network ... |
  13. -------------------------------------------------------------------------

微信将所有的视图都将加载到一个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等全局方法,数据绑定,事件分发,生命周期管理,路由管理,模块化能力等

每日一题

  1. https://github.com/WindrunnerMax/EveryDay

参考

  1. https://www.zhihu.com/question/50920642
  2. https://kangzubin.com/wxapp-decompile-1/
  3. https://github.com/berwin/Blog/issues/49
  4. https://segmentfault.com/a/1190000018631528
  5. http://eux.baidu.com/blog/fe/微信小程序架构原理
  6. https://juejin.im/post/5da444ab6fb9a04e054d93d8
  7. 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. [转帖]聊聊TPS、QPS、CPS概念和区别

    https://cloud.tencent.com/developer/article/1859053 TPS 概念 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒.它是 ...

  2. MySQL重建表统计信息

    MySQL重建表统计信息 背景 最近一段时间遇到了一些性能问题 发现很多其实都是由于 数据库的索引/统计信息不准确导致的问题. Oracle和SQLServer都遇到了很多类似的问题. 我这边联想到 ...

  3. [转帖]离线部署单机kubenetes-1.28.4

    系统版本: openEuler 22.03 (LTS-SP2) docker版本:24.0.7 kubenetes版本: 1.28.4 虚机IP: 192.168.177.138 基于 https:/ ...

  4. [转帖]linux中批量多行缩进与添加空格

    用vim打开修改python脚本的时候,将代码整体向后移动4个空格操作如下: ESC之后,ctrl+v进入多行行首选中模式 使用上下键进行上下移动,选中多行行首 shift+i,进入插入模式 连续敲击 ...

  5. goofys 鲲鹏上面编译挂载与性能测试

    goofys 鲲鹏上面编译挂载与性能测试 介质 使用go进行编译. 官网上面有 amd64的介质,但是没有aarch64的介质 需要自行编译 前几天一直编译失败. 周天在家自己测试了一把,根据gith ...

  6. [转帖]CPU缓存行

    https://www.jianshu.com/p/e338b550850f CPU缓存 执行程序是靠运行CPU执行主存中代码,但是CPU和主存的速度差异是非常大的,为了降低这种差距,在架构中使用了C ...

  7. [转帖]DISK BUSY的理解误区

    前几天有个客户的系统存在性能问题,从AWR报告上我们看到是CPU使用率过高,同时GLOBAL CACHE方面的争用比较严重.系统中的烂SQL很多,数据库中很多几十GB的大表也没有分区,总之问题很多.不 ...

  8. [转帖]【JVM】类文件结构

    Class文件的定义 一组以8字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑排列在class文件中, 中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序. 注:Ja ...

  9. 非root用户搭建sftp以及进行简要使用的介绍

    sftp的简介 关于sftp sftp是Secure FileTransferProtocol的缩写,安全文件传送协议,可以为传输文件提供一种安全的加密方法. sftp与 ftp有着几乎一样的语法和功 ...

  10. 隐私计算之多方安全计算(MPC,Secure Multi-Party Computation)

    作者:京东科技隐私计算产品部 杨博 1.背景 如今,组织在收集.存储敏感的个人信息以及在外部环境(例如云​​)中处理.共享个人信息时, 越来越关注数据安全.这是遵守隐私法规的强需求:例如美国加利福尼亚 ...