基于静态分析和动态执行的JavaScript代码精简的研究与实现
【摘要】:近年来,Web应用场景日趋丰富,应用功能也越来越复杂,许多网站都导入大型JavaScript库,以加快开发效率、增强用户体验。然而,许多JavaScript库在页面加载期间仅被部分利用,却被全部打包进捆绑包中。冗余的JavaScript代码增加了页面的权重,从而增加了下载、解析和编译JavaScript资源的时间。因此,优化JavaScript资源的有效负载以提高Web性能非常重要。而现有的模块化精简方案分析粒度大,导致函数粒度上仍存在大量的冗余。另外,静态分析难以识别JavaScript动态特性,动态分析又受限于测试覆盖率易发生误报,单独的分析类型不足以识别更为精准的冗余代码。针对以上问题,本文提出了结合静态结构分析和动态跟踪技术的混合分析方法来识别应用程序中的冗余代码,并实现了优化应用程序部署包大小的工具。主要研究成果体现在如下三个方面:(1)设计了一种多层级的静态分析结构来构建函数调用图,实现了函数粒度上的精简,细化了检测冗余代码的粒度。首先在模块层级,依据模块间的依赖关系对JavaScript文件进行分组,并对每个文件做了依赖路径分析,防止公共依赖的重复计算。其次在函数层级,以分组为单位,收集函数信息,分析调用关系,识别并报告了静态结构下的冗余函数调用。对比实验表明该静态分析结构能有效识别函数调用边并提高了检测精度。(2)提出了基于静态分析和动态执行的混合分析策略,提高了识别冗余函数的准确度。方案首先利用工具Jalangi进行动态插桩,并使用被动测量技术获取应用程序实际加载中JavaScript资源的使用情况,对静态分析难以识别的动态特性进行运行时轨迹收集,保证了代码覆盖范围。最后合并动静态结果生成混合函数调用图,识别图中根节点不可达的函数节点为冗余。(3)基于以上策略设计并实现JavaScript代码精简工具。该工具包括静态统计功能、动态插桩功能、冗余优化功能,并能对识别的冗余函数的函数体进行精简。对比实验结果表明,该工具简单有效,平均减少了部署包中28.59%的代码量,在保证代码健壮性的基础上,优化了应用程序加载性能。