微信小程序weapp的底层实现原理

首先声明:

  1. 以下所有内容仅是对微信小程序weapp的个人研究,仅有参考价值,不确保正确;
  2. 以下所有内容仅用于交流学习,不能做其他用途,欢迎大咖指点

其他

  1. 以下简称wa(weapp, 微信小程序)

一. wa的运行环境

根据微信官方的说明,wa的运行环境有3个平台,IOS的webkit(苹果开源的浏览器内核),Android的X5(QQ浏览器内核),开发时用的nw.js(C++实现的web转桌面应用);

二. 为什么wa不直接运行在浏览器(webview)中,而要绕过浏览器直接调用内核呢?

因为运行在浏览器中的webapp是做不了监控的,而wa的表现是半native app,半web app,而native app与web app和一个很重要的区别就是native app有自己的生命周期,在这之中,我们可以根据生命周期的不同时间段做出不同的调整,比如常驻内存,防止被系统杀掉,系统后台保存活度等等,而web app就没有这回事了,仅仅能够根据事件做出不同的调整,跟原生app比起来,体验就差了一些。基于此,wa当然不会像web app一样了,他需要有自己的生命周期。 
       本质上来说,wa还是运行在浏览器模式中,而承载wa的系统就是微信,用微信来管理wa的生命周期。而微信,现在本身就是一个系统。 
       微信官方贴出来的生命周期函数主要有以下3个:onLaunch(初始化完成),onShow(启动时,后由后台进入前台),onHide(由前台进入后台)

三. wa的本质是什么

wa的本质就是富单页面web应用。首先,一个wa应用程序就是一个单页面应用,所有的页面渲染和事件处理,都在一个页面内进行,但与传统的webapp不同的是,它也可以做得很丰富,就像native app一样,可以调用原生的各种接口,像网络状态、罗盘,重力,拨打电话

四. wa的wxml, wxss与html, css之间的关系

理解了wa的本质,基本上就应该比较清楚的wxml, wxss与html, css之间的关系了。很明显,wxml就是wa的模板语言,在正式部署的时候,会转化成HTML语言,而wxss则会转化为css; 
       那他们又是怎么转化的呢?wxml转化为html用的是reactjs,包括里面整套的逻辑都是建构在reactjs之上的;而wxss与css基本上没有任何不同,除了wa使用的长度单位是rpx之外。 
       加个题外话:微信官方定义的手机整个宽度是750rpx,但我觉得定位375rpx似乎更为恰当(理由与本主题无关,略)。

五. 小程序的生命周期与调用系统的api是如何实现的

这个就得依赖WeixinJSBridge.js这个脚本了,所有的关键都在这个脚本上。wa通过这个脚本调用原生的接口,而微信用这个脚本来管理wa,包括它的生命周期。这里只谈原理就不贴代码了。Android可以参考JsBridge,IOS可以参考WebViewJavascriptBridge

六. 传统的js库能用吗

大部分都不行。官方的解释是

页面的脚本逻辑是在JsCore中运行,JsCore是一个没有窗口对象的环境
  • 1

所以不能使用bom相关的对象。而依赖bom的常用的比如说jQuery就无能为力了。这种说法太牵强了。实际上,这是故意为之的。wa正式部署使用webpack打的包,而在打包的过程中,把以下变量给屏蔽了:

window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSocket
  • 1

自然你就访问不了bom对象啦,当然其他很多对象也不能访问啦。这些对象如果访问,就是undefined。

为什么要这样做呢?还不是为了管理和监控嘛。如果这些对象你能访问,那么你就可以像操作通常的网页一样操作wa,这是绝对不被允许的,所以,你懂的。 
       具体是怎么屏蔽的,帖段代码:

define("...", function(require, module, exports, window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSocket ){});
  • 1

七. 在native app中是如果实现多个应用的多个生命周期的

我的想法是微信在内部维持了一个栈,用来装载wa,而且会记录一些信息,方便管理。但这个栈比较特别,没有先后顺序,仅仅是坐个排排而已。至于这个栈是在native中实现还是在web中实现,目前还不得而知。

另外

转载随意,但请注明@senntyou

原文地址:https://www.cnblogs.com/cicichen/p/8478932.html

时间: 2024-07-31 20:07:41

微信小程序weapp的底层实现原理的相关文章

分享一下微信小程序的实例【转】

wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 shitoujiandaobu 小程序:石头剪刀布(附代码说明) audiodemo 微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义 star 微信小程序开发之五星评分 switchCity 微信小程序开发之城市选择器 城市切换 huadong_del  微信小程序滑动删除效果 jianh

微信小程序源码案例大全

微信小程序demo:足球,赛事分析 小程序简易导航 小程序demo:办公审批 小程序Demo:电魔方 小程序demo:借阅伴侣 微信小程序demo:投票 微信小程序demo:健康生活 小程序demo:文章列表demo 微商城(含微信小程序)完整源码+配置指南 微信小程序Demo:一个简单的工作系统 微信小程序Demo:用于聚会的小程序 微信小程序Demo:Growth 是一款专注于Web开发者成长的应用,- 微信小程序Demo: Music-Player 微信小程序Demo:团贷网(投资) 微信

微信小程序实例源码大全2

wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 shitoujiandaobu 小程序:石头剪刀布(附代码说明) audiodemo 微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义 star 微信小程序开发之五星评分 switchCity 微信小程序开发之城市选择器 城市切换 huadong_del  微信小程序滑动删除效果 jianh

微信小程序底层实现原理

一. wa的运行环境 根据微信官方的说明,wa的运行环境有3个平台,IOS的webkit(苹果开源的浏览器内核),Android的X5(QQ浏览器内核),开发时用的nw.js(C++实现的web转桌面应用): 二.为什么wa不直接运行在浏览器(webview)中,而要绕过浏览器直接调用内核呢? 因为运行在浏览器中的webapp是做不了监控的,而wa的表现是半native app,半web app,而native app与web app和一个很重要的区别就是native app有自己的生命周期,在

weapp微信小程序初探demo

https://github.com/donglegend/weapp-demo 参考文档开发工具安装微信weapp API git项目源码微信小程序 demo效果展示效果预览

微信小程序把玩(一)Hello WeApp

原文:微信小程序把玩(一)Hello WeApp 本篇默认已经成功安装微信小程序工具 新建项目 AppID查看公众开发平台设置查看(https://mp.weixin.qq.com) 项目名称随意填写 本地开发项目: 新建一个空的文件夹勾线当前会生成一个项目 打开项目 更详细的说多了也没啥意义看官网的简易教程非常详细!!!!!!!!! https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089807

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

原理知识准备  对于已经熟悉了session原理的同学来说,我们都清楚:在浏览器端我们会存储一个sessionId,用它来作为凭证,在服务器端得到有关本次浏览器与服务器会话的所有信息,这些信息是储存在服务器端的存储空间中的,它完全可以用来判断一个浏览器端的登录状态,因为它是由服务器端来掌控的,是安全的. 那么浏览器端是用什么来存储这个sessionId? 并且浏览器又是如何将sessionId传回给服务器的呢? 大体上是有两种方法的: 1.使用浏览器端实现的cookie功能,每次浏览器都会将服务

【转】微信小程序原理

微信小程序原理 kamidox 关注 2016.11.05 09:42* 字数 2356 阅读 14621评论 5喜欢 75赞赏 1 微信小程序使用了前端技术栈 JavaScript/WXML/WXSS.它背后的原理是怎么样的呢? 写在前面 微信小程序使用了前端技术栈 JavaScript/WXML/WXSS.但和常规的前端开发又有一些区别: JavaScript: 微信小程序的 JavaScript 运行环境即不是 Browser 也不是 Node.js.它运行在微信 App 的上下文中,不能

mpvue 应用 Vant Weapp框架开发微信小程序

今天在使用mpvue开发微信小程序的过程中需要实现一个底部上拉选择列表的功能,因为之前做过H5微信公众号的开发,使用的就是有赞的Vant-ui,所以第一时间就想到了有赞的Vant Weapp UI框架,就找到了官网,根据官网的操作说明开始一顿操作,但是妈的发现并没有什么卵用, 这是官网上的安装说明,使用npm安装,但本人实属功底太浅,在main.js中不知道怎么import进去,然后就采用第二种方法,就在pages文件夹下面的每一个页面中的main.js中添加usingComponents,但是