该项目提供友盟+SDK下载、相关辅助工具、集成demo等相关功能。
因原有SDK版本升级配置文件较复杂,需要在java端通过多个文件查询整合得到前端界面勾选内容数据,且升级SDK均需要手动拉取oss文件到服务端本地缓存,导致维护成本较高,且时间悠久无相关产品及开发文档说明,因此在本次业务升级中重构改应用。
由页面勾选,到后端进行文件的拷贝获取(原始文件已在后端缓存),创建对应目录,进行merge后压缩为最终zip文件,压缩完成后端直接流式返回zip。下载速度缓慢。且缓存的原始文件需每次手动拉取。
缺点:后端下载速度较慢。服务端存储过多过大文件的合理性。
将原始文件在编译部署时从OSS拉取到服务端,且保持缓存文件路径层级与OSS一致。根据页面勾选,先查询OSS是否有缓存,若无缓存则在后端进行各个SDK压缩包的原始文件复制,复制到生成对应的各层级文件夹中,在各文件夹内解压、merge、整合后形成最终文件夹,将最终文件夹压缩为zip后上传到OSS,得到OSS分享链接直接下载。
原始SDK存储在OSS且统一zip格式,全部原始文件压缩包大约1.5G。根据页面操作拉取整合各SDK到一个文件中。
OSS提供将读取文件夹及内容api,可将该文件夹内递归全部文件为二维列表,若要实现需把需要的原始各个zip解压在读取内容,解压后原始文件比zip格式大了约3倍,明显降低整体速度。
因原始文件中有软链接,在merge中需要注意!
// 如HTTP请求头部设置 Accept-Encoding: gzip,deflate // 压缩/解压缩文件 let lib = require('zlib') let gzip = zlib.createGzip() let rs = fs.createReadStream('./a.js') let ws = fs.createWriteStream('./a.js.gz') rs.pipe(gzip).pipe(ws)
// 解压zip文件 const StreamZip = require('node-stream-zip'); const zip = new StreamZip.async({ file: './common.zip' }); await zip.extract(null, './'); await zip.close();
为更好优化SEO,项目改造采用react ssr服务端渲染,框架结构 Node + Um-Egg + React + AndD + yk-cli。
适用于偏静态的页面展示应用。
浏览器爬虫不会等待页面异步数据全部加载完成后再去抓取页面信息。而服务端渲染返回到前端页面是获取全部首屏数据并生成html,即访问路由时获取。
通过路由请求node中html全部内容,减少加载js文件过程耗时,提高用户访问页面时间。
原本是客户端渲染,现改为node层处理生成html,当并发量较大时占用服务端资源也更大。
如上文5.2.中介绍,
要格外注意首屏数据处理以及项目引用第三方库处理数据情况!
【文章作者:友盟+技术团队】
⭐️开发者中心重构将友盟SDK统一输出,包含APP端、网页端、小程序/小游戏、H5各端,以及相关SDK下载和自动集成方式。
重构前后下载效率提升数倍,使得用户体验感迅速提升。同时友盟+也会更加重视相关文档的输出,从功能描述到技术实现以及用户体验等等维度,更好地帮助用户快速准确地解决问题。