背景最近,我们团队开始尝试用新的方案(双端开发,上线PC端和移动端)来解决前端资源紧缺的问题同时)。但是经过测试,测试指出我们的移动端页面首屏速度太慢(6s+),体验极差。我试着在PC上打开这个页面,用了4s+。加载瀑布流如下:粗略分析,存在以下三个问题:应用页面采用了懒加载策略,详见红圈区域;入口js,包体积太大,gzip后还有1.3M,原来大小是4M+日常静态资源未启用cdn优化三部曲1.应用架构优化在应用架构中,懒加载是一种常见的优化技术,其中可以只在需要的时候加载资源,减少应用启动时间和流量消耗。然而,懒加载并不是万能的,有时过多的懒加载会降低应用程序的性能。因此,在优化应用架构时,应该根据具体情况权衡是否使用延迟加载。瀑布流结合上图分析,资源加载时间为4s+,index.html的时间对于前端来说是不可控的,完全依赖于域名的解析和响应服务器。但是js和css的部分是完全可控的。我们可以提前500ms的资源加载时间,即去掉懒加载架构方案。2.包大小优化包大小优化是优化应用程序性能的重要组成部分。包的大小直接影响应用的加载时间和用户体验。看到1.3M的gzip包大小,我们第一反应是打开webpack的analyze查看包体积分布,结果完全超乎想象(这是开发模式,其他页面入口都有注释,只有一个pageoftheperiodmenureserved):上图也很直观的暴露了几个问题:同一个chunk,同一个依赖多次进入(图中以cook-design为首,见下图)package的大小分布极度不均匀,分块不同导入同版本依赖(懒加载策略导致)项目依赖管理,防止多版本在项目依赖管理中,尽量避免多版本依赖。多版本依赖会导致包体积变大,甚至会产生冲突和错误。在日常业务组件的开发中,可以将对基础组件(如antd)的依赖设置为peerDependencies。我们的解决方案是将业务依赖的引入方式标准化,通过解析强制执行指定版本。组件库支持treeShaking。在使用第三方组件库时,通过treeShaking,可以只加载应用中需要的组件和功能,减少包体积和加载时间。以前我们在引入antd3的时候,为了防止包太大,我们引入了babel-plugin-import来帮我们去掉无用的代码。但是antd4遵守了es-module规范,配置了sideEffect,这使得它天生支持treeShaking。我们的项目在很大程度上依赖于当地生活的厨师设计和厨师设计/图标。由于缺少treeShaking的配置,这两个组件已经全部打进去了,冗余组件和冗余组件带来的依赖在5M左右。所以我们和相关维护者交换了相关想法后,他们同意增加配置升级来支持treeShaking。我们团队自己的双端组件库cook-design-mixin也支持这种配置。经过优化应用架构,优化依赖版本,组件支持treeshaking,采用分包策略,我们的构建结果(生产模式)是这样的:Removinguselesscode优化一,我在文章开头提到,我们的项目是一个双端架构的项目,是编译时的方案,也就是说PC端和移动端是两套不同的资源。但是因为我们是在一个应用中开发,所以PC端的代码和移动端的代码是混在一起的。我们通过标准化和构建插件来解决代码混合问题。//下面是一个示例import{Decorator}from'@alife/wa-mixin-core';importDMobilefrom'./wa-mobile';importDDesktopfrom'./wa-desktop';exportdefault(props:{isShowTipStatus:boolean;showMode?:boolean;})=>{returnDecorator({Mobile:
