论文部分内容阅读
随着网页技术的快速发展,网页内容不断增多,网页功能也变得更加丰富全面,然而网页HTML、静态资源体积也随之变大,网页内容生成时间随之变长,这使得网页加载速度减缓,严重影响了用户体验。同时目前主流的网页加载方案(服务器端渲染与异步加载渲染)中,在服务器端返回数据之前浏览器和网络均处于空闲状态,存在着较为明显的优化空间。Bigpipe加载方案借助于CPU流水线的思想,将页面拆分为多个页面分块(Pagelet),每当服务器端生成好Pagelet的内容,就借助分块传输编码将Pagelet传给浏览器端,使得服务器、网络、浏览器流水线式工作,是对现有方案的良好改进。然而Bigpipe方案中由于JavaScript和CSS也需要拆分,导致HTTP请求数大量增加。Node.js是近年兴起的服务器端JavaScript运行环境,性能出众,且涌现了较多优秀的静态资源打包方案,论文认为Node.js平台是较为合适的Bigpipe方案实现和改进平台。为利用Bigpipe方案优化目前的网页加载过程,同时考虑到Bigpipe对编程模式存在诸多要求、需以框架形式进行实现,因此本文提出了一种基于Node.js平台、实现并行式Bigpipe方案的Web框架,借助于Node.js平台异步I/O、事件驱动模型完成Pagelet生成这一 I/O密集型任务,提升并行式Bigpipe执行速度。同时,为解决Bigpipe方案的HTTP请求数问题,论文提出在框架运行之前完成Pagelet的前端资源的合并,然后借助于Node.js平台的打包工具Webpack完成前端资源的打包,将前端资源数量大大缩减。目前业界使用的前端资源打包方案是在页面服务运行前打包,在不具备页面访问数据情况下只能简单假设各页面访问次数均匀分布、根据JavaScript模块被其他JavaScript模块的引用次数来优化打包结果,这一打包过程在绝大多数页面访问次数非均匀分布的网站中存在着明显的优化空间。因此,考虑到框架具备运行时(runtime)能力,同时框架又引入了打包工具,本文提出让框架在运行时附带统计各个页面的访问次数,同时,论文设计了一种启发式静态资源优化算法,以尽可能的增大网页加载过程中使用的缓存大小为目标,根据静态资源访问情况判定该资源是否应该抽离至公共包中。论文提出和实现让框架定时地根据当前的页面访问情况利用启发式算法计算更为适配的静态资源打包策略,并重新打包以优化静态资源的实际使用。经对比验证,本文提出的框架能有效提升网页加载速度,且静态资源动态打包优化功能对比目前未结合页面数据的优化方案,能对静态资源做出针对性优化,优化效果明显。在测试案例中,框架实现了18.8%的加载速度提升以及75.8%的静态资源加载流量节省。