技术实践第一期|友盟+开发者平台Node.js重构之路

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 因原有SDK版本升级配置文件较复杂,需要在java端通过多个文件查询整合得到前端界面勾选内容数据,且升级SDK均需要手动拉取oss文件到服务端本地缓存,导致维护成本较高,且时间悠久无相关产品及开发文档说明,因此在本次业务升级中重构改应用。

一、问题背景


该项目提供友盟+SDK下载、相关辅助工具、集成demo等相关功能。

因原有SDK版本升级配置文件较复杂,需要在java端通过多个文件查询整合得到前端界面勾选内容数据,且升级SDK均需要手动拉取oss文件到服务端本地缓存,导致维护成本较高,且时间悠久无相关产品及开发文档说明,因此在本次业务升级中重构改应用。

1.jpg

二、改造目标


  • 新版体验: SDK_开发者中心-友盟+
  • 满足升级功能迭代包括新增多端整合功能等,以及视觉全新体验。
  • java端迁移到node,直连oss简化配置文件,节约”人工智能“的升级维护成本。
  • 下载由后端转到oss直连下载, 大大提高下载效率。
  • SDK端各原文件统一格式为zip,文件存储与服务端分离,提高后续维护性。
  • 使用SSR服务端渲染,提高SEO优化。


三、下载方案

2.jpg

1. 原下载方案

由页面勾选,到后端进行文件的拷贝获取(原始文件已在后端缓存),创建对应目录,进行merge后压缩为最终zip文件,压缩完成后端直接流式返回zip。下载速度缓慢。且缓存的原始文件需每次手动拉取。

缺点:后端下载速度较慢。服务端存储过多过大文件的合理性。

2. 新下载方案

将原始文件在编译部署时从OSS拉取到服务端,且保持缓存文件路径层级与OSS一致。根据页面勾选,先查询OSS是否有缓存,若无缓存则在后端进行各个SDK压缩包的原始文件复制,复制到生成对应的各层级文件夹中,在各文件夹内解压、merge、整合后形成最终文件夹,将最终文件夹压缩为zip后上传到OSS,得到OSS分享链接直接下载。


四、技术选型对比


1. 缓存原始文件方式对比

原始SDK存储在OSS且统一zip格式,全部原始文件压缩包大约1.5G。根据页面操作拉取整合各SDK到一个文件中。

  • 不推荐!直连OSS拉取对应SDK。

OSS提供将读取文件夹及内容api,可将该文件夹内递归全部文件为二维列表,若要实现需把需要的原始各个zip解压在读取内容,解压后原始文件比zip格式大了约3倍,明显降低整体速度。

  • 推荐!每次应用部署时,在app.js中拉取OSS原始文件到服务端缓存,当缓存完成后则在缓存复制,当无缓存时则oss拉取兜底。


2. 文件夹压缩/解压zip工具对比

因原始文件中有软链接,在merge中需要注意!

2.1、 zlib 模块

  • 优势:
  1. 可对数据进行压缩和解压处理,减小数据体积,加快传输速度。
  2. 对文件进行压缩/解压。
  • 缺点:不可压缩/解压缩文件夹。


// 如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)


2.2、 node-stream-zip

  • 优势:zip文件压缩/解压库,使用方便,可操作文件/文件夹。
  • 缺点:不识别解压后文件中的软链接,导致软链接打不开错误。

// 解压zip文件 const StreamZip = require('node-stream-zip'); const zip = new StreamZip.async({ file: './common.zip' }); await zip.extract(null, './'); await zip.close();


2.3、 compressing

  • 优点:可同步/异步压缩或解压文件/文件夹,相关文档简单清晰。
  • 缺点:不识别解压后文件中的软链接,导致软链接打不开错误。


2.4、 adm-zip

  • 优势:
  1. 将 zip 文件直接解压缩到磁盘或内存缓冲区中。
  2. 压缩文件并将它们以 .zip 格式或压缩缓冲区存储到磁盘。
  3. 从现有 .zip 更新/添加新文件/删除文件的内容。
  • 缺点:只能针对当前zip包进行操作整理,或者将文件逐一复制出来。但实际业务需求根据页面勾选将多个SDK压缩包解压生成新的对应目录层级后整合为一个压缩包。


2.5、 archive

  • 缺点:较长时间未更新,且解压后内部文件有软链会重复生成真实文件。


五、关于SSR服务端渲染

为更好优化SEO,项目改造采用react ssr服务端渲染,框架结构 Node + Um-Egg + React + AndD + yk-cli。

适用于偏静态的页面展示应用。


5.1 SSR过程实现

3.jpg


5.2 initProps与state注意点

  • 页面首屏渲染只会渲染Component.initProps数据。
  • 在state定义的数据首屏不会渲染,而在前端组件中渲染。


5.3 SSR优势

  • 有利于SEO

浏览器爬虫不会等待页面异步数据全部加载完成后再去抓取页面信息。而服务端渲染返回到前端页面是获取全部首屏数据并生成html,即访问路由时获取。

  • 有利于首屏渲染

通过路由请求node中html全部内容,减少加载js文件过程耗时,提高用户访问页面时间。


5.4 SSR缺点

  • 服务端压力增大

原本是客户端渲染,现改为node层处理生成html,当并发量较大时占用服务端资源也更大。

  • 维护成本相对变大

如上文5.2.中介绍,

要格外注意首屏数据处理以及项目引用第三方库处理数据情况!


【文章作者:友盟+技术团队】


⭐️开发者中心重构将友盟SDK统一输出,包含APP端、网页端、小程序/小游戏、H5各端,以及相关SDK下载和自动集成方式


重构前后下载效率提升数倍,使得用户体验感迅速提升。同时友盟+也会更加重视相关文档的输出,从功能描述到技术实现以及用户体验等等维度,更好地帮助用户快速准确地解决问题。



相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
2天前
|
JavaScript 前端开发 开发者
跟踪最新的JavaScript游戏开发技术趋势需要多方面的努力和参与
【5月更文挑战第14天】跟踪JavaScript游戏开发趋势:访问专业网站和博客(如Medium, GameDev.net),参加JSConf和GDC会议,订阅技术期刊,关注开源项目(如Phaser, Three.js),利用社交媒体(Twitter, Reddit)和在线论坛(Stack Overflow),学习新技术(如WebGL, WebAssembly)。通过这些方式保持对行业动态的敏锐度。
11 4
|
2天前
|
存储 JavaScript 前端开发
使用Vue.js构建交互式前端的技术探索
【5月更文挑战第12天】Vue.js是渐进式前端框架,以其简洁和强大的特性深受开发者喜爱。它聚焦视图层,采用MVVM模式实现数据与视图的双向绑定,简化开发。核心特性包括响应式数据绑定、组件化、模板系统和虚拟DOM。通过创建Vue实例、编写模板及定义方法,可以构建交互式前端,如计数器应用。Vue.js让复杂、交互式的前端开发变得更加高效和易维护。
|
2天前
|
存储 监控 JavaScript
使用Node.js构建实时聊天应用的技术指南
【5月更文挑战第12天】本文指导使用Node.js、Express.js和Socket.IO构建实时聊天应用。技术栈包括Node.js作为服务器环境、WebSocket协议、Express.js作为Web框架和Socket.IO处理实时通信。步骤包括项目初始化、安装依赖、搭建服务器、实现实时聊天功能、运行应用以及后续的完善和部署建议。通过这个指南,读者可以学习到创建简单实时聊天应用的基本流程。
|
2天前
|
数据可视化 JavaScript NoSQL
搭建接口平台YApi详解(含搭建node环境)
搭建接口平台YApi详解(含搭建node环境)
26 0
|
2天前
|
机器学习/深度学习 人工智能 JavaScript
【JavaScript 与 TypeScript 技术专栏】JavaScript 与 TypeScript 的未来发展趋势
【4月更文挑战第30天】本文探讨了JavaScript和TypeScript的未来发展趋势。JavaScript将聚焦性能优化、跨平台开发、人工智能和WebAssembly的整合。TypeScript则将深化与其他框架的结合,强化类型检查,适应前端工程化,并与WebAssembly融合。两者在Vue 3.0及Web开发中的结合将更加紧密,TypeScript有望在更多领域扩展应用。随着技术进步,JavaScript和TypeScript的结合将成为Web开发的主流趋势。
|
2天前
|
JavaScript 前端开发 安全
【JavaScript与TypeScript技术专栏】TypeScript如何帮助JavaScript开发者避免常见错误
【4月更文挑战第30天】TypeScript,JavaScript的超集,通过静态类型检查和面向对象特性,帮助开发者避免类型错误、引用错误和逻辑错误,提升代码质量和可维护性。它引入类型注解、接口、可选链和空值合并,使代码更清晰、安全。对于大型项目,TypeScript的接口、类和泛型有助于代码结构化和模块化。学习TypeScript能提高JavaScript开发效率。
|
2天前
|
JavaScript 前端开发 IDE
【JavaScript与TypeScript技术专栏】使用TypeScript优化JavaScript应用性能
【4月更文挑战第30天】本文探讨了如何使用TypeScript优化JavaScript应用性能。TypeScript通过静态类型检查、更好的编译器优化和IDE支持提升代码稳定性和开发效率。利用类型注解、泛型、类与继承以及枚举和常量,开发者能构建高效、灵活和健壮的代码。逐步将TypeScript引入现有JavaScript项目,并通过案例分析展示性能提升效果。随着TypeScript社区的发展,它将在Web开发性能优化中扮演更重要角色。
|
2天前
|
开发框架 JavaScript 前端开发
【JavaScript 与 TypeScript 技术专栏】TypeScript 在 Web 开发中的前沿应用
【4月更文挑战第30天】TypeScript在Web开发中日益重要,以其强大的类型系统提升代码质量,支持组件化开发,与React、Vue、Angular等框架良好集成。在大型项目管理中,TypeScript助于代码组织和优化,提高团队协作效率。此外,它提升开发体验,提供智能提示和错误检测。众多成功案例证明其前沿应用,未来将在Web开发领域持续发挥关键作用。
|
2天前
|
JavaScript 前端开发 IDE
【JavaScript与TypeScript技术专栏】JavaScript与TypeScript混合编程模式探讨
【4月更文挑战第30天】本文探讨了在前端开发中JavaScript与TypeScript的混合编程模式。TypeScript作为JavaScript的超集,提供静态类型检查等增强功能,但完全切换往往不现实。混合模式允许逐步迁移,保持项目稳定性,同时利用TypeScript的优点。通过文件扩展名约定、类型声明文件和逐步迁移策略,团队可以有效结合两者。团队协作与沟通在此模式下至关重要,确保代码质量与项目维护性。
|
2天前
|
JavaScript 前端开发 IDE
【JavaScript与TypeScript技术专栏】TypeScript在JavaScript库与框架开发中的作用
【4月更文挑战第30天】TypeScript,微软开发的JavaScript超集,以其强类型和面向对象特性,正成为提升Web项目质量和效率的关键工具,尤其在库和框架开发中。它通过类型系统减少运行时错误,提供内置文档,便于重构,增强IDE支持,以及支持模块化。流行框架如React、Angular已支持TypeScript,未来有望成为开发高质量库和框架的标准语言。随着社区增长,TypeScript将在Web开发领域扮演更重要角色。