在优化访问性能时,除了充分利用浏览器缓存之外,还需要涉及一个性能指标:coverage rate(覆盖率)
可以在Chrome浏览器的控制台中按:ctrl + shift + p,查找coverage,打开覆盖率面板
开始录制后刷新网页,即可看到每个js文件的覆盖率,以及总的覆盖率
想提高覆盖率,需要尽可能多的使用动态导入,也就是懒加载功能,将一切能使用懒加载的地方都是用懒加载,这样可以大大提高覆盖率
webpack4默认是允许import语法动态导入的,但是需要babel的插件支持,最新版babel的插件包为:@babel/plugin-syntax-dynamic-import
,以前老版本不是@babel
开头,已经无法使用,需要注意
动态导入最大的好处是实现了懒加载,用到哪个模块才会加载哪个模块,可以提高SPA应用程序的首屏加载速度,Vue、React、Angular框架的路由懒加载原理一样
-
安装babel插件
npm install -D @babel/plugin-syntax-dynamic-import
-
修改.babelrc配置文件,添加
@babel/plugin-syntax-dynamic-import
插件{ "presets": ["@babel/env"], "plugins": [ "@babel/plugin-proposal-class-properties", "@babel/plugin-syntax-dynamic-import" ] }
-
将jQuery模块进行动态导入
function getComponent() { return import('jquery').then(({ default: $ }) => { return $('<div></div>').html('main') }) }
-
给某个按钮添加点击事件,点击后调用getComponent函数创建元素并添加到页面
window.onload = function () { document.getElementById('btn').onclick = function () { getComponent().then(item => { item.appendTo('body') }) } }
但有时候使用懒加载会影响用户体验,所以可以在懒加载时使用魔法注释:Prefetching,是指在首页资源加载完毕后,空闲时间时,将动态导入的资源加载进来,这样即可以提高首屏加载速度,也可以解决懒加载可能会影响用户体验的问题
import(/* webpackPrefetch: true */ 'jquery').then(({ default: $ }) => {
return $('<div></div>').html('main')
})
相当于
<link rel="prefetch" href="*.chunk.js">
可以利用服务器缓存实现第一次加载资源,第二次从缓存中取出就不需要再次请求
location ~.*\.(js|css|html|png|jpg)$
{
expires 3d;
}
- expires 3d; //表示缓存3天
- expires 3h; //表示缓存3小时
- expires max; //表示缓存10年
- expires -1; //表示永远过期。
重新发布上线不重启服务器,用户再次访问服务器就不需要再次加载第三方模块了
但此时会遇到一个新的问题,如果再次打包上线不重启服务器,客户端会把以前的业务代码和第三方模块同时缓存,再次访问时依旧会访问缓存中的业务代码,所以会导致业务代码也无法更新
需要在output节点的filename中使用placeholder语法,根据代码内容生成文件名的hash:
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].[contenthash:8].bundle.js',
publicPath: '/'
},
之后每次打包业务代码时,如果有改变,会生成新的hash作为文件名,浏览器就不会使用缓存了,而第三方模块不会重新打包生成新的名字,则会继续使用缓存