在这快速发展的互联网时代,网站的性能已经成为用户评价和使用体验的关键因素之一。而一个高效优化过的网站,不仅可以提升访客的满意度,同时也能助力企业形象的塑造。以下将从构建、网络、资源加载等多个角度,为大家分享如何全方位提升网站搭建性能的经验。
构建优化
首先让我们来关注一下网站资源的加载情况。以优化前的PC站点为例,最大vendor包竟然有MB(经过gzip压缩后),如果没有做额外配置的话,webpack将所有的第三方依赖都打入了这个包,随着引入依赖越来越多,这个包也会越来越大。为了更好地分析依赖关系,我们可以借助webpack-bundle-analyzer将打包后的内容展示为方便交互的树状图。
CDN引入
接下来谈谈CDN的作用。CDN的工作原理是将源站的资源缓存到位于全球各地的节点上,这样一来,用户请求资源时可以就近返回节点上的缓存的资源,从而避免了网络拥塞和减轻了源站压力,确保了用户访问资源的速度和体验。
然而,我们知道打包后的产物本身也需要上传至CDN。因此,我们可以将体积较大的第三方依赖单独拆出来放到CDN上,既不会占用打包资源,也不会影响最终包体积。对于那些可以直接通过CDN引入的文件,比如g6,我们就可以直接使用。
外部引用
对于不想被webpack打包的库,但又需要在程序中以import、require或者window/global全局等方式使用的,我们可以通过配置externals来实现。首先将CDN引入的依赖加入到externals中,借助html-webpack-plugin将CDN文件打入html文件夹。
需要注意的是,在html中配置的CDN引入脚本一定要放在body的最底部,这样可以避免加载过程阻塞页面渲染。如果放在body上方或header内,将导致用户需要等待整个页面的加载完成;若放在body外,则会在业务代码被加载之后加载,模块使用了该模块将会报错。
拆分和懒加载
在一些场景下,我们将第三方依赖拆分为多个子依赖,比如monaco。对于这些无法通过CDN引入的文件,我们需要在webpack设置一些规则将它们单独打包为一个vendor包。
而对于那些不在首屏使用的依赖包,我们可以采用动态import的方式来进行懒加载。需要注意的是,并非所有场景都适合此方法,如果有很高的性能要求,且依赖本身也比较大,那么可能会看到明显的延迟。以下是一个使用React懒加载的示例:
const MonacoEditor = React.lazy(() => import('react-monaco-editor'));
此代码将会在组件首次渲染时自动导入包含MonacoEditor组件的包。
路由懒加载
与React懒加载类似,路由懒加载同样适用于提升网站性能。对于每个路由都使用懒加载的方式引入,则每个模块都会被单独打为一个js文件,首屏只会加载当前模块引入的js。但需要注意的是,此方法可能会导致切换模块时出现白屏或loading效果。
语言包优化
在某些场景下,语言包会占用整个包体积的非常大一部分。因此,我们可以通过插件如ContextReplacementPlugin来优化语言包。
经过以上全方位的优化后,我们将惊喜地发现模块已经被我们拆得非常均匀,只会在对应页面渲染时加载对应模块,这对首屏渲染速度有显著提升,同时也提升了用户体验和网站性能。