无需后台接入?带你玩转VasSonic 2.0里的Local Server

2023-05-16

腾讯手Q增值团队于今年8月份正式开源了VasSonic,一个轻量级高性能的Hybrid框架。VasSonic框架使用并行加载、动态缓存、增量更新等手段,实现了终端H5页面的秒开,对用户体验的优化做的非常极致。时隔三个月,在业务需求的驱动和开源社区的共同努力下,VasSonic迎来了开源后的第一次重大更新:VasSonic 2.0。

点击阅读原文直接访问VasSonic源码:
https://github.com/Tencent/VasSonic


VasSonic 2.0新特性介绍

VasSonic 2.0新增了以下几个特性:

  • 支持Local Server模式,在该模式下无需后台配合亦可完成秒开,大大降低接入门槛

  • 支持自定义请求头和自定义响应头

  • 支持Cache-Control来控制缓存生命周期

  • 支持非utf-8编码


其中Local Server模式是2.0版本最大更新,也是本文重点介绍的一个特性。


玩转Local Server模式

Local Server模式介绍


一般情况下,一个项目要接入VasSonic,需要前端、终端、后台三端配合使用这个框架,才能达到预期的效果,这样有一定的接入成本。为了使开发者更加方便地使用VasSonic,Local Server模式应运而生。Local Server,顾名思义,相比于一般情况下终端、前端、后台全部接入,它允许在业务后台无法及时支持时,通过终端模拟server,提供本该后台支持的能力,从而降低接入成本。


开启Local Server模式后,对于从非Sonic后台返回的页面数据,终端会在收到数据的第一时间执行本该Sonic后台完成的处理逻辑:对页面进行模板和数据的拆分,对比本地的模板和数据缓存,根据两者的对比结果,添加Sonic响应头(eTag、template-change、template-tag),将此次请求返回伪装成正常情况下的Sonic后台返回。终端逻辑层面上对返回的数据是来自真正的Server还是Local Server并无感知,终端只需按照正常逻辑进行处理即可。因此在Local Server模式下,后台无需接入Sonic。

Local Server接入方式

在Android端使用Local Server,首先需要引用最新的VasSonic依赖,在build.gradle中添加:

compile 'com.tencent.sonic:sdk:2.0.0-beta'

Local Server功能默认是关闭的,需要初始化SonicSession配置时打开Local Server,Android端代码如下:

SonicSessionConfig.Builder sessionConfigBuilder = new SonicSessionConfig.Builder();
sessionConfigBuilder.setSupportLocalServer(true);
sessionConfigBuilder.build();

在iOS端使用Local Server,需要在Podfile中指定引入:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'


target 'TargetName' do

    pod 'VasSonic', '2.0.0-beta'

end

然后在代码中通过 SonicSessionConfiguration 打开Local Server

SonicSessionConfiguration *configuration = [SonicSessionConfiguration new];

configuration.enableLocalServer = YES;

[[SonicEngine sharedEngine] createSessionWithUrl:self.url withWebDelegate:self         withConfiguration:configuration];

具体接入方法请详细参考官方Demo (https://github.com/Tencent/VasSonic)。

Local Server执行流程

VasSonic根据本地是否有缓存以及本地缓存数据与服务器数据的差异情况分为首次加载、完全缓存、数据更新、模板更新四种模式。除首次加载外,其他三种模式在Local Server下的执行流程与正常模式均有所差异。


首次加载

Local Server的首次加载与正常的首次加载流程一致。具体细节可参考快速模式或者标准模式的首次加载流程。

非首次加载·完全缓存

完全缓存是指本地数据与服务器数据相比,没有任何变更。以快速模式为例,Local Server的执行流程如下:

0?wx_fmt=png

上图主要展示了两条并行线,左边是在主线程执行的Webview流程,右边是在子线程执行Sonic流程。

Sonic线程:

Sonic会话创建完成后,首先获取url对应的本地缓存数据,并通知主线程Webview加载该数据。接着Sonic会与Server建立连接,如果Server返回304,则Server数据没有变更,直接使用本地缓存,Sonic流程结束;否则,Sonic拉取到完整的Server数据,计算其SHA1作为eTag,如果与请求头中的eTag相同,就确定本次请求是完全缓存模式,Sonic流程结束。 


主线程:
主线程在收到Sonic通知后,加载本地缓存数据,交给Webview渲染。


非首次加载·数据更新

数据更新就是本地的数据跟服务器的数据相比,只有data部分有变化,模板与服务器一样。以快速模式为例,Local Server的执行流程如下:


0?wx_fmt=png

Sonic线程:
Sonic会话创建完成后,首先获取url对应的本地缓存数据,并通知主线程Webview加载该数据。接着Sonic与Server建立连接,读取到完整的Server数据,计算其SHA1作为eTag,如果与请求头中的eTag不同,Sonic将Server数据拆分为template和data,计算template的SHA1作为template-tag,如果与请求头中的template-tag相同,则说明模板没有变更,此时确定本次请求是数据更新,将拆分得到的data与本地保存的data做对比计算,得到增量数据。最后通知Webview进行数据更新,并更新本地缓存。

主线程:
数据更新模式下主线程会先收到加载本地缓存数据的通知,而Sonic线程通知主线程刷新data时,主线程可能还未开始加载本地缓存,也可能已经开始渲染本地缓存。如果WebView还未开始加载本地缓存,就会直接加载最新的数据(拆分得到的data跟本地模版合成的数据);如果主线程已经加载本地缓存,就会直接通过Js接口让WebView用增量数据刷新页面。


非首次加载·模板更新

模板更新是本地的模板跟服务器的模板不一致。以快速模式为例,Local Server的执行流程如下:


0?wx_fmt=png

Sonic线程:
Sonic会话创建完成后,首先获取url对应的本地缓存数据,并通知主线程Webview加载该数据。接着Sonic与Server建立连接,读取到完整的Server数据,计算其SHA1作为eTag,如果与请求头中的eTag不同,Sonic将Server数据拆分为template和data,计算template的SHA1作为template-tag,如果与请求头中的template-tag不同则说明模板发生了变更,此时确定本次请求是模板刷新模式,通知主线程Webview进行模板刷新,并更新本地缓存。
 

主线程:
主线程会先收到加载本地缓存数据的通知,之后Sonic线程通知主线程进行模板刷新时,无论WebView是否已经开始加载本地缓存数据,都会直接重新加载最新的Server数据,完成模板刷新。

小结:Local Server模式的优缺点

优点: Local Server模式下,简化了终端执行逻辑;而且无需后台接入Sonic,大大减少了接入成本。
缺点: Local Server模式相比后台接入,损失了一定的性能。因为终端模拟后台的话,非首次加载场景需要等Server数据全部返回才能计算eTag,template-tag,template-change,从而判断是哪种模式(完全缓存、局部刷新还是模板更新)。

其他新增特性

1. 支持自定义请求头和自定义响应头

VasSonic 2.0支持添加自定义请求头和自定义响应头,方式如下:

SonicSessionConfig.Builder sessionConfigBuilder = new SonicSessionConfig.Builder();

sessionConfigBuilder.setCustomRequestHeaders(requestHeaderMap);

sessionConfigBuilder.setCustomResponseHeaders(responseHeaderMap);

sessionConfigBuilder.build();


2. 支持Cache-Control来控制缓存生命周期

VasSonic 2.0支持在Http响应头部添加Cache-Control字段来控制缓存生命周期,目前支持max-age、private、public三个可选值。

3. 支持非UTF-8编码

VasSonic 2.0优化了字符编码的使用。如果http响应头中包含"Content-Type"字段,则优先使用该字段的值作为字符编码,否则默认使用UTF-8编码。


结语

2.0版本是VasSonic开源后的第一次重大更新,这个版本汇集了开源社区各位热心开发者的想法与建议,非常感谢大家的关注与参与。 我们的愿景是成为业界最好的H5加速框架!开发者在使用过程遇到问题或者有好的建议,欢迎在 Github上给我们提Issues。

Talk is cheap,read the code. If you are interested in VasSonic, just start to use it. Thank you for reading ~

点击阅读原文直接访问VasSonic源码:
https://github.com/Tencent/VasSonic


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无需后台接入?带你玩转VasSonic 2.0里的Local Server 的相关文章

  • C语言新收获

    若a 61 3 xff0c b 61 2 xff0c c 61 1 xff0c 则 d 61 a gt b xff0c 由于a gt b为真 xff0c 因此关系表达式a gt b的值为1 xff0c 所以赋值后d的值为1 f 61 a g
  • C语言swith语句小细节

    1 swtich 中的 里的数据只能为整形或字符型 xff0c 不能为浮点型 xff01 2 swith x xff5b case 1 语句1 case 2 xff1a 语句2 case 3 语句3 xff1b break case 4 语
  • switch语句每个csse后面可以跟多个值吗

    如果今天是星期三 xff0c 后天就是星期五 xff1b 如果今天是星期六 xff0c 后天就是星期一 我们用数字1到7对应星期一到星期日 给定某一天 xff0c 请你输出那天的 后天 是星期几 输入格式 xff1a 输入第一行给出一个正整
  • c学习笔记

    指针之间可以比较大小 xff0c 前提是两个指针指向同一数组 如 char a 20 xff1b char p1 61 a 43 1 char p2 61 a 43 2 则p2 gt p1
  • zzulioj1150

    数数多少个整数 题目描述 小明的老师给小明出了一道题目 xff1a 数数一篇文章出现了多少个数字 xff0c 请你帮帮他吧 输入 输入一个字符串 xff0c 由空格 英文字母 数字组成 xff0c 以回车结束 xff0c 长度小于1000
  • 1152: 二分搜索

    题目描述 在有序序列中查找某一元素x 输入 首先输入一个正整数n n lt 61 100000 xff0c 表示该序列有n个整数 xff0c 然后按从小到大的顺序输入n个整数 xff1b 接着是一个正整数m xff0c 表示有m次查找 xf
  • C语言反思提醒自己

    例如 xff1a char fun char p char s 101 return s 这样将不能正确返回字符串s xff0c 因为在离开fun 函数后该内存空间将不再存在 xff0c 应该使用malloc函数申请内存 xff0c 该函数
  • 按键-第1季第9部分-朱有鹏-专题视频课程

    按键 第1季第9部分 1716人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第9个课程 xff0c 综合解决了独立按键和矩阵式按键的处理方法 xff0c 涉及到 xff1a IO的输入输出 按键抖动和消抖 中断的引入
  • C语言反思提醒自己

    int a scanf 34 d 34 amp a 当键入07时 xff0c a中存的是7 xff0c 自动舍弃前导0
  • zzulioj1168(账单)

    题目描述 每到月末 xff0c 小明就会对这个月的支出账单进行整理和统计 如今电脑已经普及大学校园 xff0c 所以小明想让电脑帮忙做这件事情 聪明的你就为小明编一个程序来完成这件事情吧 输入 多实例测试 首先输入一个整数ncase xff
  • 总结java中关于继承中的成员属性和成员方法的多态细节

    问题背景 xff1a 下面的代码会输出什么 xff1f 40还是20 xff1f public class Animal public int age 61 40 public void eat System out println 34
  • 【java】浅谈instanceof关键字

    作用 xff1a 用于判断某个对象是否是某个特定类或该特定类的一个实例 返回一个布尔类型 一般格式 object instanceof class class可以是类也可以是接口 xff09 具体使用 xff1a 分编译阶段和运行阶段 xf
  • zzulioj 1185: 添加记录(结构体专题)

    题目描述 有一学生成绩表 xff0c 包括学号 姓名 3门课程成绩 已知该成绩表按学号升序排序 请编程实现 xff0c 添加一个新的学生信息 xff0c 且使成绩表仍按学号有序 xff1b 若待添加的学号与已有学号重复 xff0c 则输出错
  • 初学Java小细节自总

    1 如果子类的构造方法中没有显示地调用父类的构造方法 xff0c 那么Java编译器会自动在子类的构造方法中插入一条默认的super 语句 xff0c 来调用父类的无参构造方法 因此 xff0c 如果父类没有提供无参构造方法 xff0c 而
  • 如何配置Java的环境变量

    1 找到电脑的环境变量 xff08 直接在电脑左下角放大镜搜环境变量即可 xff09 xff1a 2 在环境变量的系统变量里新建一个名称为 xff1a JAVA HOME变量值为jdk的安装目录 xff08 直接点浏览目录去找jdk的安装根
  • 字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题

    首先计算机是美国人发明的用来处理数据的 xff0c 那么问题来了美国人如何和计算机交流呢 xff1f 怎么把他们的字符存储到计算机里面呢 美国需要存储的字符仅仅只是一些英文大小写 xff0c 数字 xff0c 标点 xff0c 和一些特殊字
  • 1022: 三整数排序(利用三目运算符可以使程序更加简洁)

    从键盘输入三个整数x y和z xff0c 按从大到小的顺序输出它们的值 输入 输入三个整数x y和z 输出 按从大到小的顺序输出它们的值 样例输入 复制 20 16 18 样例输出 复制 20 18 16 自己的思路 xff1a 首先找到最
  • 1025: 最大字符(scanf输入问题以及gets()和getchar()和scanf()的区别)

    给你三个ASCII字符 不含空白字符 包括空格 制表符 t 回车换行符 n xff0c 找出其中最大的那个 输入 输入包含三个字符 xff0c 之间有一个空格隔开 输出 输出ASII码最大的那个字符 xff0c 占一行 样例输入 复制 a
  • 定时器和计数器-第1季第10部分-朱有鹏-专题视频课程

    定时器和计数器 第1季第10部分 1573人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第10个课程 xff0c 主要内容是51单片机的定时器和计数器 xff0c 本课程的学习目标是对定时器的作用和意义有深入理解 x
  • 1037: 四则运算(易错:浮点数不能使用==或者!=)

    给你一个简单的四则运算表达式 xff0c 包含两个实数和一个运算符 xff0c 请编程计算出结果 输入 表达式的格式为 xff1a s1 op s2 xff0c s1和s2是两个实数 xff0c op表示的是运算符 43 xff0c 也可能

随机推荐

  • 1053: 正弦函数

    内存限制 xff1a 30 MB时间限制 xff1a 1 000 S 题目描述 输入x xff0c 计算上面公式的前10项和 输入 输入一个实数x 输出 输出一个实数 xff0c 即数列的前10项和 xff0c 结果保留3位小数 样例输入
  • 【无标题】

    递归算法的设计要素 递归思维是一种从下向上的思维方式 xff0c 使用递归算法往往可以简化我们的代码 xff0c 而且还帮我们解决了很复杂的问题 递归算法的难点就在于它的逻辑性 xff0c 一般设计 递归算法需要考虑以下几点 明确递归的终止
  • 递归,递推,迭代区别

    程序调用自身的编程技巧称为递归 xff08 recursion xff09 递归做为一种算法在程序设计语言中广泛应用 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法 xff0c 它通常把一个大型复杂的问题层层转化为一个与原问题
  • 51单片机无源蜂鸣器播放群青

    直接放代码 注 xff1a 晶振频率11 0592MHz 延时函数部分 delay c include lt intrins h gt void Delay ms unsigned int n 64 11 0592MHz while n u
  • vs调试技巧(详细)

    调试技巧 一 简介1 调试是什么2 调试的基本动作3 Debug和Rlease的介绍 二 调试介绍1 调试环境准备2 快捷键的使用 三 调试时看当前信息1 查看临时变量的值2 查看内存 四 多多动手调试 一 简介 1 调试是什么 调试本身是
  • Handling error: InvalidRequestException, Missing grant type报错原因之参数写错

    首先 xff0c 检查代码是否写的有问题 如果没有 xff0c 检查postman里面的各项参数 比如俺就是grant type写成了grant type xff08 排错的时候眼睛找瞎 xff09 xff01 xff01 xff01 改过
  • stm32 U盘升级 bootloader程序 基于stm32f407 将升级包下载到U盘中,插入到设备中,完成对主程序的升级

    stm32 U盘升级 bootloader程序 基于stm32f407 将升级包下载到U盘中 xff0c 插入到设备中 xff0c 完成对主程序的升级 xff0c 无需上位机操作 清单 u盘升级的bootloader源码 YID 32206
  • Java代码注释

    注释可以提高程序的可读性 xff0c 注释包含的文字不会对程序产生任何影响 xff0c 在Java中 xff0c 代码注释主要有以下几种 xff1a 1 单行注释 为单行注释标记 xff0c 从 开始到换行为止的所有内容均被注释而被编译器忽
  • [搞机]手机解bl锁后root刷系统

    刷机存在一定风险 xff0c 例如操作失误导致无法开机 软件损坏 设备变砖等 刷机前 xff0c 建议先了解自己手机品牌和型号 技术水平等 xff0c 再进行操作 本文章只是把自己了解的和大伙说说 xff0c 不提供软件下载 xff0c 只
  • 蜂鸣器-第1季第11部分-朱有鹏-专题视频课程

    蜂鸣器 第1季第11部分 1182人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第11个课程 xff0c 主要讲解了无源和有源蜂鸣器的概念和区别 xff0c 蜂鸣器的发声原理 定时器控制蜂鸣器的编程技巧 本节的学习目
  • Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范 xff0c 在涉及到Linux版本问题时经常容易混淆 xff0c 主线版本 xff0f 稳定版 xff0f 长期支持版本经常搞不清楚 xff0c 本文主要记录下内核版本命名的规则以及如何查看L
  • 基于51单片机光照强度检测智能窗帘Proteus仿真

    资料编号 xff1a 163 下面是相关功能视频演示 xff1a 163 基于51单片机光照强度检测智能窗帘Proteus仿真 源码 43 仿真 43 全套资料 功能讲解 xff1a 采用51单片机作为控制CPU xff0c 采用ADC08
  • 双色球小程序

  • 树莓派(3B):启动流程,系统初始化配置,引脚图图示说明

    目录 一 xff0c 树莓派刷机及串口方式登陆 准备工具 操作步骤 二 xff0c 配置树莓派接入网络 树莓派入网 固定树莓派的ip地址 三 xff0c 网络SSH方式登陆树莓派 打开树莓派SSH功能 登陆SSH 四 xff0c 用国内的源
  • 网络安全产品认知——边界防护

    边界防护的安全理念 边界防护 网络边界 具有不同安全级别的网络之间的分界线都可以定义为网络边界 网络边界防护 xff1a 针对不同网络环境所设置的安全防御措施 企业网络常见边界 企业内部网络与外部网络 企业部门之间 gt 业务类型 重要部门
  • python列表

    目录 1 列表 xff08 list 线性表 xff09 2 定义一个列表 1 直接用 2 用list 3 常见的方法 1 append object 向列表尾部追加元素 2 insert index object 向指定位置 xff08
  • kubernetes应用flannel失败

    按照官网给的命令 kubectl apply f https raw githubusercontent com coreos flannel master Documentation kube flannel yml 回头查看k8s的运行
  • 腾讯祭出大招VasSonic,让你的H5页面首屏秒开!

    作者简介 xff1a 陈志兴 xff0c 腾讯SNG增值产品部高级工程师 xff0c 主要负责手Q个性化业务 手Q WebView等项目 喜欢阅读优秀的开源项目 xff0c 听听音乐 xff0c 偶尔也会打打竞技类游戏 本文根据作者在201
  • 直流电机和步进电机-第1季第12部分-朱有鹏-专题视频课程

    直流电机和步进电机 第1季第12部分 1966人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第12个课程 xff0c 主要讲解了直流电机和步进电机 xff0c 其中步进电机是关键 xff0c 通过学习让大家初步掌握步
  • 无需后台接入?带你玩转VasSonic 2.0里的Local Server

    腾讯手Q增值团队于今年8月份正式开源了VasSonic xff0c 一个轻量级高性能的Hybrid框架 VasSonic框架使用并行加载 动态缓存 增量更新等手段 xff0c 实现了终端H5页面的秒开 xff0c 对用户体验的优化做的非常极