@wwanghee
2017-06-29T00:39:03.000000Z
字数 910
阅读 635
1、安装sonic_differ模块
tnpm install @tencent/sonic_differ --save
2、引入sonic_differ模块
const sonic_differ = require('@tencent/sonic_differ');
3、拦截后端直出数据,针对sonic方案进行数据加工
1)建立sonic缓存结构体
let sonic = {buffer: [],write: function (chunk,encoding) {let buffer = chunk;let ecode = encoding || 'utf8';if(!Buffer.isBuffer(chunk)){buffer = new Buffer(chunk,ecode);}sonic.buffer.push(buffer);}};
2)后端直出时拦截数据,交给sonic_differ模块进行处理
response.on('data',(chunk,encoding)=>{sonic.write(chunk,encoding)});response.on('end',()=>{let result = differ(ctx, Buffer.concat(sonic.buffer));sonic.buffer = [];if(result.cache){//304,对应sonic完全缓存模式return ''}else{//其它sonic模式return result.data}})
、原理介绍
后端的sonic接入最核心的关键就是拦截直出的内容,对此内容进行二次加工。加工的过程就是sonic_differ模块做的事情,加工过后将数据再输出回前端。
sonic模式共有四种(前面应该有文档介绍,这里再强调一下):
1)sonic首次访问模式:第一次访问,没有模板和数据缓存,返回原始直出数据
2)sonic完全缓存模式:等同于页面304,返回空
3)sonic数据更新模式:sonic的模板没有变化,只有数据有变化,返回变化的数据
4)sonic模板更新模式:sonic的模板有发生变化,返回原始直出数据
具体原理如下图所示:
