高端响应式模板免费下载

响应式网页设计、开放源代码、永久使用、不限域名、不限使用次数

什么是响应式网页设计?

2024年小程序结构设计(通用3篇)

小程序结构设计 第1篇

Web 技术来渲染小程序是存在一些不可控因素和安全风险的。这是因为Web技术是非常开放灵活的,我们可以利用JavaScript 脚本随意地跳转网页或者改变界面上的任意内容。这个时候安全问题摆到了微信团队的台面上。如果微信小程序可以离线浏览,只需要小程序开发者把一些应用数据缓存到本地,然后通过javascript脚本把小程序渲染的webview跳转到其他的在线网页,那么这个体验就非常的糟糕。想必前端开发者会非常熟悉这个操作。

除此之外,javascript还可以通过操作DOM,直接获取小程序内部的一些敏感数据,比如用户的信息,商家信息等等,那么小程序将毫无安全可言。

为了解决安全管控问题,小程序阻止开发者使用一些浏览器提供的比如跳转页面、操作DOM、动态执行脚本的开放性接口。如果这些东西一个一个地去禁用,那么势必会进入一个糟糕的循环,因为javascript实在是太灵活了,浏览器的接口也太丰富了,很容易就遗漏一些危险的接口,而且就算是禁用掉了所有感觉到危险的接口,也势必防不住浏览器内核的下次更新。指不定又会出现一些漏洞。

因此,要彻底解决这个问题,必须提供一个沙箱环境来运行开发者的JavaScript 代码。这个沙箱环境不能有任何浏览器相关接口,只提供纯JavaScript 的解释执行环境,那么像HTML5中的ServiceWorker、WebWorker特性就符合这样的条件,这两者都是启用另一线程来执行 javaScript。但是考虑到小程序是一个多 webView 的架构,每一个小程序页面都是不同的webView 渲染后显示的,在这个架构下不好去用某个webView中的ServiceWorker去管理所有的小程序页面。

小程序结构设计 第2篇

单线程架构,即传统html开发的时候,官方建议script加载js的时候放在Body下方位置。为什么建议在下方插入script呢,就是因为单线程阻塞问题。因为html文件是从上到下渲染的,如果中间插入js的话,则会中断HTML节点渲染,转而去执行js,js执行完后继续渲染节点。就是因为单线程阻塞问题才建议在下方插入script,并且配合可以拿到已经渲染完成的节点。

这种情况当然也可以通过一些手段来规避,比如async、defer等。这两个属性加上后,虽然不会阻塞DOM渲染,但是并不是根本上解决问题,而是合理地安排了资源解析而已。

单线程阻塞问题还没结束,另一个问题又扑面而来。如果所有资源都是通过请求来获取,那么不光会阻塞js解析的时间,还要加上js请求的时长。请求js资源时间不可控,怎么办呢。这个时候另一种选择就至关重要,就是缓存。微信中这一点做的很好,就是WXSDK,微信SDK是一系列jsApi的集合,提供了微信的丰富原生能力和微信内部的方法。

在曾经开发微信公众号h5的时候我们需要手动的注入某个版本的微信SDK到自身的项目中去,这种方式的用户体验并不是很好,因为加载js,并且解析js逻辑的时候是会抢占渲染资源的,原因也就是上面刚讲过的单线程阻塞问题,如果在我们有承接平台的时候,比如微信客户端,将微信SDK这样的资源放在客户端Native中,在加载页面的时候再进行动态的注入,由Native层注入到视图层。这样的做法的好处很明显,首先会使包的体积变小,其次,减少了网络请求的发送。

小程序中也用到了微信SDK,当然不仅仅只有微信SDK做了这样的处理,由Native层注入到双线程中。还有底层基础库、Service等都是事先放在Native层中的,当页面进行加载的时候再进行动态的注入。好比如说公司里给你配了一台电脑来开发项目一样,曾经工作人员都需要自己带着自身的开发工具去公司上班,如果公司统一配好了开发工具,那么你再也不用带着电脑去公司上班了,减少了每个员工为工作需要提前准备的资源。

可以看出,双线程的好处不仅仅是一分为二而已,还有强大的Native层做背后支撑。Native层除了做一些资源的动态注入,还负责着很多的事情,请求的转发,离线存储,组件渲染等等。界面主要由成熟的 Web 技术渲染,辅之以大量的接口提供丰富的客户端原生能力。同时,每个小程序页面都是用不同的WebView去渲染,这样可以提供更好的交互体验,更贴近原生体验,也避免了单个WebView的任务过于繁重。此外,界面渲染这一块还定义了一套内置组件以统一体验,并且提供一些基础和通用的能力,进一步降低开发者的学习门槛。值得一提的是,内置组件有一部分较复杂组件是用客户端原生渲染的,以提供更好的性能。

小程序结构设计 第3篇

小程序开发框架的口号是简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。

小程序框架分为两部分:WXML 和 WXSSJavaScript 即逻辑层,视图层与逻辑层间的数据传输和事件系统依托于微信app,这既是双线程。

小程序一直以来采用的都是 AppService 和 WebView 的双线程模型,基于 WebView 和原生控件混合渲染的方式,小程序优化扩展了 Web 的基础能力,保证了在移动端上有良好的性能和用户体验。Web 技术至今 30 多年历史,作为一款强大的渲染引擎,它良好兼容性和丰富的特性。 尽管各大厂商在不断优化 Web 性能,但由于其繁重的历史包袱和复杂的渲染流程,使得 Web 在移动端的表现与原生应用仍有一定差距。为了进一步优化小程序性能,提供更为接近原生的用户体验,我们在 WebView 渲染之外新增了一个渲染引擎 Skyline,其使用更精简高效的渲染管线,并带来诸多增强特性,让 Skyline 拥有更接近原生渲染的性能体验。

当小程序基于 WebView 环境下时,WebView 的 JS 逻辑、DOM 树创建、CSS 解析、样式计算、Layout、Paint (Composite) 都发生在同一线程,在 WebView 上执行过多的 JS 逻辑可能阻塞渲染,导致界面卡顿。以此为前提,小程序同时考虑了性能与安全,采用了目前称为「双线程模型」的架构。

在 Skyline 环境下,我们尝试改变这一情况:Skyline 创建了一条渲染线程来负责 Layout, Composite 和 Paint 等渲染任务,并在 AppService 中划出一个独立的上下文,来运行之前 WebView 承担的 JS 逻辑、DOM 树创建等逻辑。这种新的架构相比原有的 WebView 架构,有以下特点:

界面更不容易被逻辑阻塞,进一步减少卡顿

无需为每个页面新建一个 JS 引擎实例(WebView),减少了内存、时间开销

框架可以在页面之间共享更多的资源,进一步减少运行时内存、时间开销

框架的代码之间无需再通过 JSBridge 进行数据交换,减少了大量通信时间开销

而与此同时,这个新的架构能很好地保持和原有架构的兼容性,基于 WebView 环境的小程序代码基本上无需任何改动即可直接在新的架构下运行。WXS 由于被移到 AppService 中,虽然逻辑本身无需改动,但询问页面信息等接口会变为异步,效率也可能有所下降;为此,我们同时推出了新的 Worklet 机制,它比原有的 WXS 更靠近渲染流程,用以高性能地构建各种复杂的动画效果。

新的渲染流程如下图所示:

小程序支持页面使用 WebView 或 Skyline 任一模式进行渲染,Skyline 页面可以和 WebView 页面混跳,开发者可以页面粒度按需适配 Skyline。

Skyline 在渲染流程上较 WebView 更为精简,其对节点的渲染有着更精确的控制,尽量避免不可见区域的布局和绘制,以此来保证更高的渲染性能。WebView 由于其整体设计不同以及兼容性等问题,渲染流水线的实现更加冗长复杂。

在光栅化策略上,Skyline 采用的是同步光栅化的策略,WebView 是异步分块光栅化的策略。两种策略各有千秋,但 WebView 的策略存在一些难以规避的问题,例如:快速滚动会出现白屏问题;滚动过程中的 DOM 更新会出现不同步的问题,进而影响到用户体验。

在此基础上,我们还进一步实现了很多优化点。

Skyline 下默认启用了新版本的组件框架 glass-easel,该版本适应了 Skyline 的单线程模型,使得建树流程的耗时有效降低(优化 30%-40%),同时 setData 调用也不再有通信开销和序列化开销。

Skyline 内置组件的行为更接近原生体验,部分内置组件(如 scroll-view、swiper 等)借助于底层实现,有更好的性能和交互体验。同时,我们将部分内置组件(如 view、text、image 等)从 JS 下沉到原生实现,相当于原生 DOM 节点,降低了创建组件的开销(优化了 30% 左右)。

长列表是一个常用的但又经常遇到性能瓶颈的场景,Skyline 对其做了一些优化,使 scroll-view 组件只渲染在屏节点(用法上有一定的约束),并且增加 lazy mount 机制优化首次渲染长列表的性能,后续我们也计划在组件框架层面进一步支持 scroll-view 的可回收机制,以更大程度降低创建节点的开销。

同 WebView 传输 WXSS 文本不同,Skyline 在后台构建小程序代码包时会将 WXSS 预编译为二进制文件,在运行时直接读取二进制文件获得样式表结构,避免了运行时解析的开销(预编译较运行时解析快 5 倍以上)。

Skyline 通过精简 WXSS 特性大幅简化了样式计算的流程。在样式更新上,与 WebView 全量计算不同,Skyline 使用局部样式更新,可以避免对 DOM 树的多次遍历。Skyline 与小程序框架结合也更为紧密,例如: Skyline 结合组件系统实现了 WXSS 样式隔离、基于 wx:for 实现了节点样式共享(相比于 WebView 推测式样式共享更为精确、高效)。在节点变更、内联样式和继承样式的更新上,Skyline 也进行了一些优化,从而保证样式计算的性能。

此外,对于 rpx 单位,我们直接在样式计算阶段原生支持,这样避免了在 JS 层面做太多额外的计算。

在 WebView 渲染模式下,一个小程序页面对应一个 WebView 实例,并且每个页面会重复注入一些公共资源。而 Skyline 只有 AppService 线程,且多个 Skyline 页面会运行在同一个渲染引擎实例下,因此页面占用内存能够降低很多,还能做到更细粒度的页面间资源共享(如全局样式、公共代码、缓存资源等)。

在基于 Web 体系的架构下,小程序的部分基础体验会受限于 WebView 提供的能力(特别是 iOS WKWebView 限制更大一些),使得一些技术方案无法做得很完美,留下一些潜在的问题。

iOS 下原生组件同层渲染的原理先前有介绍过,本质上是在 WKWebView 黑盒下一种取巧的实现方式,并不能完美融合到 WKWebView 的渲染流程,因此很容易在一些特殊的样式发生变化后,同层渲染会失效。在 Skyline 下可以很好地融合到渲染流程中,因此会更稳定。

iOS 下 WKWebView 会受操作系统统一管理,当内存紧张时,操作系统就会将不在屏的 WKWebView 回收,会使得小程序除前台以外的页面丢失,虽然在页面返回时,我们对页面做了恢复,但页面的状态并不能 100% 还原。在 Skyline 下则不再有该问题。

由于 WebView 的内存占用较大,页面层级最多有 10 层,而 Skyline 在内存方面更有优势,因此在连续 Skyline 页面跳转(复用同一引擎实例)的情况下,不再有该限制。

要达到类原生应用的体验,除渲染性能要好外,做好交互动画也很关键。在 Web 体系下,难以做到像素级可控,交互动画衔接不顺畅,究其原因,在于缺失了一些重要的能力。为此,Skyline 提供一套全新的交互动画能力。

Worklet 机制是 Skyline 交互动画体系的基础,它能够很方便地将 JavaScript 代码跑在渲染线程,那么基于 Worklet 机制的 动画模块,便能够在渲染线程同步运行动画相关逻辑,使动画不再会有延迟掉帧。

在原生应用的交互动画里,手势识别与协商是一个很重要的特性,而这块在 Web 体系下是缺失的,因此 Skyline 提供了基于 Worklet 机制的 手势系统。

支持常用手势的识别,如缩放、拖动、双击等,并能够渲染线程同步监听手势、执行手势相关逻辑;

支持手势协商处理,能够在遇到手势冲突(常见于滚动容器下)时决定让哪个手势生效,以实现更顺畅的动画衔接。

页面间中转进行自定义的转场动画,在原生应用里也是一个很常见的交互动画。在原来的小程序架构下,每个页面都是独立的 WebView 渲染,互相隔离,其跨页能力是基本不具备的。因此,Skyline 提供了基于 Worklet 机制的 自定义路由模块,能实现市面上大多数页面转场动画效果。

支持 跨页面共享元素,能够很方便地将上一个页面的元素“共享”到下一个页面,并伴随着过渡动画,同时支持了一套可定制化接口,能实现自定义的过渡动画。

对内置组件的扩展也是重要一环,特别是 scroll-view 组件,很多交互动画与滚动息息相关,Skyline 添加了很多在 Web 下很难做到又非常重要的特性。

内置下拉刷新的实现,并完善相关事件。原来 WebView 的实现基于 transform,性能不够好且动画衔接不顺畅。

提供“下拉二楼”交互的机制。

提供 sticky 吸顶组件,能很方便地实现吸顶元素交错切换。

使 scroll-view 组件在内容未溢出时也能滚动,让用户得到及时的交互反馈。

为 scroll-view 组件提供更多控制能力,如最小触发滚动距离(min-drag-distance)、滚动结束事件(scrollend)、滚动原因(isDrag)等。

提供原生的 swiper 实现,相比 WebView 基于 transform 的实现,性能更好。

除了交互动画的系列能力外,借助 Skyline 的优势,我们还提供了很多高级特性。

瀑布流是一种常用的列表布局方式,得益于 Skyline 在布局过程中的可控性,我们直接在底层实现并提供出来,渲染性能要比 WebView 更优。

大多数小程序都会基于 canvas 实现自定义分享图的功能,一方面,需要通过 canvas 绘图指令手动实现,较为繁琐;另一方面,在分享图的布局较复杂时,或者在制作长图时会受限于系统对 canvas 尺寸限制,canvas 的方案实现成本都会很大。得益于 Skyline 在渲染过程中的可控性,Skyline 能直接对 WXML 子树进行截图,因此我们直接提供了截图组件,这样能复用更完善的 WXSS 能力,极大降低开发成本。

在聊天对话的场景下,列表的滚动常常是反向的(往底部往上滚动),若使用正向滚动来模拟会有很多多余的逻辑,而且容易出现跳动,而 scroll-view 提供的 reverse 属性很好的解决这一问题。

还有更多计划提供出来的特性,请详见特性状态

框架的核心是一个响应的数据绑定系统,可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新。

通过这个简单的例子来看:

双线程模型小程序的架构模型有别与传统web单线程架构,小程序为双线程架构。

微信小程序的渲染层与逻辑层分别由两个线程管理,渲染层的界面使用 webview 进行渲染;逻辑层采用 JSCore运行JavaScript代码。

开发者通过框架将逻辑层数据中的 name 与视图层的 name 进行了绑定,所以在页面一打开的时候会显示 Hello Weixin!

猜你喜欢