小程序

当前端开发者带着固有的认知进行小程序开发的时候,发现很多地方都行不通,比如页面元素无法获取,只能通过 setData 更新页面,还有各种浏览器接口都无法正常使用。所以,很多人都难以理解,认为小程序偏偏特立独行为难开发者,其实很大程度上是因为小程序基于安全和管控考虑下的设计。

小程序在思考什么

当年互联网还不成熟的时候,许多网页开发没有做好 XSSCSRF 这样的漏洞保护,导致出现用户账户被盗用、财产被转移等问题。对于小程序来说,不仅需要对各种小程序进行内容的管控,同样需要给用户和开发者提供有安全保障的环境。

小程序如何保障用户安全

比如,小程序提供了 <open-data> 组件,用于无须授权的情况下可展示用户的敏感信息(昵称、头像、性别、地理位置等),如果开发者直接通过 DOM API 获取到这些信息,意味着只要用户打开了这个小程序,在未授权的情况下自己的相关信息就会被盗取。

我们能看到,很多风险都来自 JavaScript 脚本对网页中 DOM 的访问和操作。想要解决这个风险就得将 JavaScript 代码放置在没有浏览器环境的沙箱环境中运行。

小程序使用 iOS 内置的 JavaScriptCore 框架和在 Android 的 JSCore 引擎(最初为腾讯 x5 内核,后来是 V8 引擎),提供了一个没有浏览器相关接口的环境,用于 JavaScript 脚本的执行。

上面我们提到,小程序中使用了沙箱环境来运行 JavaScript 代码,在这个环境中无法进行一些 DOM 操作。那么,开发者如何更新页面内容、控制页面的展示呢?答案是使用 setData()。

为什么使用 setData()可以更新页面内容呢?这是因为在小程序中,界面渲染相关任务则是由单独的 WebView 线程来完成。也就是说,在小程序中,JavaScript 脚本的执行和界面渲染不在一个线程中。

小程序如何提升用户体验

目前,主流的 App 主要有 3 种,它们对应了 3 种渲染模式:

  1. Native App,使用了 Native(纯客户端原生技术)渲染;
  2. Web App,使用了 WebView(纯 Web 技术)渲染;
  3. Hybrid App,使用了 WebView+原生组件(Hybrid 技术)渲染。

小程序使用的是 WebView + 原生组件,即 Hybrid 方式。显然,这种方式结合了 Native 和 Webview 的一些优势,让开发者既可以享受 Webview 页面的低门槛和在线更新,又可以使用部分流畅的 Native 原生组件,同时通过代码包上传、审核、发布的方式来对内容进行管控。

引入原生组件提升用户交互体验

通过页面预渲染减少启动和加载耗时

我们能看到渲染层里有多个 WebView,这是因为在小程序中为了方便用户可快速地前进和回退,存在着多个界面,而每个界面都是一个单独的 WebView 线程,因此会有多个 WebView。