原理
https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000a8806958588cb00862bd5851c0a
在大部分开发者看来,ECMAScript和JavaScript表达的是同一种含义,但是严格的说,两者的意义是不同的。ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本程序设计语言, JavaScript 是 ECMAScript 的一种实现。理解 JavaScript 是 ECMAScript 一种实现后,可以帮助开发者理解小程序中的 JavaScript同浏览器中的 JavaScript 以及 NodeJS 中的 JavaScript 是不相同的。
- 浏览器的JavaScript = ECMScript + BOM(browser object model) + DOM
- NodeJS的JavaScript = ECMScript + NPM +Native(fs / http )
- 小程序的JavaScript = ECMScript + 小程序框架 + 小程序API
小程序在不同平台的表现不同主要在于三大平台实现的 ECMAScript 的标准有所不同,比如 iOS9和iOS10 所使用的运行环境并没有完全的兼容到 ECMAScript 6 标准。
结构
wxml > 渲染层 > webview | 多个webview线程
js >逻辑层 > jsCore | 单线程,整个APP实例都是单例的(得益于客户端系统有JavaScript 的解释引擎。ios javascriptCore框架 安卓下腾讯x5提供)
note:
- 可以把wxml想成jsx 同样只是语法糖而已 本质是js。需要渲染到DOM上才是真的html
- setData: 把数据从逻辑层传到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上
- 每个页面都有一个webview线程控制渲染
- onReady触发时,表示逻辑层已经可以和渲染层交互了
- setData的原则:设置需要改变的最小单位数据
- currentTarget为当前事件所绑定的组件,而target则是触发该事件的源头组件。
重点:双线程模型
Q:为什么不选择网页形式?
A:技术上而言 ui渲染和js脚本都在一个线程里执行 可能会被抢占资源。安全而言,为了防止自由跳转,DOM操作的开放性,必须提供一个沙箱环境来运行开发者的JavaScript 代码。这个沙箱环境不能有任何浏览器相关接口,只提供纯JavaScript 的解释执行环境。
双线程模型带来的:天生异步
因为通信都变成了不同线程间的通信,包括渲染层与js逻辑层之间的顺序需要保证,js逻辑层与微信主线程的通信也有时延,所以大部分接口都是异步的。
组件
小程序的Exparser框架有参考DOM的shadow dom 原来如此!怪不得组件内的css不会影响到外面~
https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/%E5%BD%B1%E5%AD%90_DOM
https://aotu.io/notes/2016/06/24/Shadow-DOM/index.html
微信开发者工具 很有用 值得复看!
https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000e22a89849d81b0086384a25b40a
逻辑层模拟
渲染层模拟
客户端模拟
通信模拟(websocket)
Q: 如何避免用户在开发者工具中不使用本可以使用的BOM?
A: 将开发者的代码包裹在define里时 使之局部变量化
https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000a80769707d86b008602a955b80a