微信小程序使用了前端技术栈 JavaScript/WXML/WXSS。它背后的原理是怎么样的呢?javascript
微信小程序使用了前端技术栈 JavaScript/WXML/WXSS。但和常规的前端开发又有一些区别:html
在微信小程序官方文档上,有下面这段话:前端
微信小程序运行在三端:iOS、Android 和 用于调试的开发者工具java
- 在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中
- 在 Android 上,小程序的 javascript 代码是经过 X5 内核来解析
- 在 开发工具上, 小程序的 javascript 代码是运行在 nwjs(chrome内核) 中
咱们先从开发工具谈起。node
小程序的 javascript 代码运行在 nwjs 中。nwjs 是什么鬼呢?官方介绍是这样写的:程序员
NW.js (previously known as node-webkit) lets you call all Node.js modules directly from DOM and enables a new way of writing applications with all Web technologies.web
nwjs 合并 Browser 和 Node.js 的运行时,可使用前端开发技术来开发跨平台的应用程序。借助 Node.js 访问操做系统原生 API 的能力,能够开发中跨平台的应用程序。微信小程序开发工具就是使用 nwjs 开发的。若是你是 Mac 用户,进入目录 /Applications/wechatwebdevtools.app/Contents/Resources/app.nw/app
能够看到开发工具的实现代码,固然代码是通过混淆的。网上流行的破解版本开发工具原理上就是修改这里面的代码。chrome
与此相似的,一个更火的项目是 Electron,由 GitHub 推出的,它也是把 Browser 和 Node.js 结合,用来开发跨平台的应用程序。程序员们应该据说过 Atom 这个编辑器界的后起之秀。包括微软拥抱开源社区的编辑器 vscode 也是使用 Electron 开发的。npm
这两个平台有什么区别?为何微信选择 nwjs 呢?咱们不妨猜一猜。json
从技术角度来说:
从应用角度来说:
从这个分析猜想,微信选择 nwjs 的缘由多是出于代码保护。毕竟开发工具能够上传小程序,有些接口和数据须要比较严密的保护。哪位大牛能够挖挖看哪些代码被保护起来了。
下面内容彻底是猜想的,若有言中,实属运气。
微信小程序的运行环境应该更相似 ReactNative 之类,而不是纯 Html5。二者最大的不一样在于,ReactNative 的界面是由原生控件渲染出来的,而 Html5 的界面是由浏览器内核渲染出来的。二者在性能上有较大的差别,感兴趣的能够参阅个人另一篇文章《跨平台 App 开发技术方案汇总》。
原理上,小程序是如何在微信 App 里运行的呢?
咱们来意淫一下小程序加载运行的过程:
app.json
获得应用程序的配置信息(导航栏,窗口样式,包含的页面列表等)app.js
app.json
里配置的第一个页面这个只是从开发者眼中看到的一个简化版的过程,实际过程应该比这要复杂得多,涉及到浏览器线程(就是运行咱们的逻辑层代码 app.js 等的线程)和 AppService 线程之间的交互。从官方网站上的一个图片能够看出端倪:
至于微信 App 是如何与小程序的逻辑层 javascript 交互的呢?能够简单地概括以下:
JavaScript 是脚本语言,能够在运行时解释并执行。微信 App 里包含了一个 JavaScript 引擎,由它来负责执行逻辑层的 JavaScript 代码。那么 JavaScript 调用的小程序相关 API 怎么实现的呢?答案是最终会被翻译成实如今微信 App 里的原生接口。好比开发者调用 wx.getLocation(OBJECT)
获取当前地理位置,微信 App 里的 JavaScript 引擎在执行这个代码时,会去调用微信 App 里实现的原生接口来获取地理位置坐标。
感兴趣的朋友能够阅读我以前推荐过的一篇文章《React Native 从入门到原理》。文章分析的虽然是 ReactNative,但实际上原理是相通的。
微信小程序最大的好处是不须要作设备适配,只要微信能运行,小程序就能运行。小程序虽然是一个封闭形态下的前端开发技术,但借助微信的巨大影响力,几乎全部人都在往里面冲。微信小程序太火了,内测火,公测更火。内测刚出来,就有人用微信小程序实现了商城,并开源。感叹一下:你的热情,就像一把火,燃烧了整个沙漠。
做为开发者,提几个不足: