再谈 webpack build 及 加载优化
之前项目多,事情忙,一直没时间写博客,现在空闲下来了,总结一下
之前讲过了关于 build 压缩文件的方法,有兴趣的可以看下: 点击查看
现在讲讲一个页面的首屏加载速度该如何提升
提前说明 需要 webpack-bundle-analyzer 插件来进行 build 文件的分析
异步文件和必须文件
首先是异步文件,可以按功能分,也可以按照路由分块,目的就是尽量较少首次加载的必须代码的大小
即登录,注册和必须存在的组件是必须加载组件,优先度最高,这些组件是不能为异步的,其他尽量都要设置为异步组件
如果你的项目足够小,一个 main 文件总共200k 那么可以不使用分块(仅限 web 端,移动端另说)
因为我使用的是 react+antd 还有一些附带的大包 如 immutable,moment,babel-polyfill等,而且最重要的是这些包是必须的,大小快接近1M了
当然我是不会将接近 1M 的必需文件放在一个加载包里的,这样的话首屏加载恐怕要2S以上了
这个时候 webpack 的分块功能就出来了
一般来说 浏览器的并发数量是6个资源,webpack 生成文件呢,至少会有一个 css 文件会在 head 加载;
去除 css 剩余5个位置 1000k/5 = 200k
所以 将 1000k 的必需文件包平均分成5分,并发加载
速度即可缩短至 1/5 (当然这是理想状态)
简单解释一下: 1个人搬10公斤货物,需要 1个小时,但是现在一个线程就是一个人,就变成了5个人搬10公斤货物,速度就只要20分钟了
现在简介一下 webpack3 和 webpack4 该怎样分块:
webpack3:
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks(module) {
return (
module.resource &&
/\.js$/.test(module.resource) &&
!new RegExp('/antd/lib|/react-dom|/moment').test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
})
类似于这样 RegExp 中的表示不会被加到这个包中,有一点需要注意,剩余的会自动加在默认包里,所以我前面才会说 需要 webpack-bundle-analyzer;
因为想要达到最佳状态,需要根据插件的页面多次试验分块
webpack4:
splitChunks: {
cacheGroups: {
vendor: {
test(chunks){
return !new RegExp('/antd/lib|/react-dom|/moment').test(chunks.context) && /[\\/]node_modules[\\/]/.test(chunks.context)
},
name: "vendor",
chunks: "all",
reuseExistingChunk: true
}
}
}
webpack4 和 3 的道理差不多,只是格式不一样罢了
prefetch , preload ,dns-prefetch
这两个的作用,虽然网上现在也是一搜一大把,我还是在这里说下他的作用和我简单的心得和体会
preload
表示浏览器一检测到该条脚本就会对服务器进行请求,通常会写在上部,因为越先检测就越先加载
prefetch
表示浏览器一检测到该条脚本就会在空闲的时候,下载脚本,并缓存到disk
dns-prefetch
表示浏览器一检测到该条脚本就会解析CDN的地址的DNS放的位置越前越好
所以他们分别作用的块是这样的:
- 必须模块和 cdn 模块需要的是preload
- 异步模块需要的是 prefetch 记住最好是所有异步模块都加上
- 使用dns-prefetch前提是你必须先知道域名是什么,而且更换域名时也要同步更换,效果立竿见影,加快页面加载时间
下面放上一个标准使用方法:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
<link rel="dns-prefetch" href="//www.grewer.cn/">
<link rel="preload" as="script" href="/static/js/module1.js" >
<link rel="preload" as="script" href="/static/js/module2.js">
<link rel="preload" as="script" href="/static/js/module3.js">
<link rel="preload" as="style" href="/static/css/main.css">
<link rel="prefetch" href="/static/js/async1.chunk.js">
<link rel="prefetch" href="/static/js/async2.chunk.js">
<link rel="prefetch" href="/static/js/async3.chunk.js">
<link rel="prefetch" href="/static/js/async4.chunk.js">
<link rel="prefetch" href="/static/js/async5.chunk.js">
<link rel="prefetch" href="/static/js/async6.chunk.js">
<link href="/static/css/main.css" rel="stylesheet">
</head>
<body>
<script type="text/javascript" src="/static/js/module1.js" ></script>
<script type="text/javascript" src="/static/js/module2.js" ></script>
<script type="text/javascript" src="/static/js/module3.js" ></script>
</body>
</html>
http2 服务器推送
http2出来大概3年了吧,大多数人都以为他的作用就是加密就 HTTPS 而已,其实他还有一个最重要的功能,服务器推送
服务器推送的基础是 HTTP2,所以需要先升级 然后需要再服务器配置,一旦有客服端请求文件,如 index.html
就可以将文件立马推送,而且关键还是他没有并发限制,比如图片,你可以一下子推送10个,20个,任意个文件! 只有客户端需要的
效果如下:
(图片来自网络,如果挂了还请自行寻找)
但是配合 webpack 还有一个问题,就是 webpack 生成的文件会带有 hash 参数,比如这样的文件名: /static/js/system.9b7a5941.chunk.js
要推送文件需要知道文件的名称(也许可以自动化,但是我不怎么了解)
这个问题的解决就交给大家了
不过即使没有服务器推送,有 preload也是十分好用了
结语
减小请求时间的方法有很多,还请大家酌情使用
再谈 webpack build 及 加载优化的更多相关文章
- 再谈javascript图片预加载技术
图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展 ...
- vue项目首屏加载优化实战
问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...
- Vue SPA 首屏加载优化实践
写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...
- vue加载优化策略
vue.js是一个比较流行的前端框架,与react.js.angular.js相比来说,vue.js入手曲线更加流畅,不管掌握多少都可以快速上手.但是单页面应用也都有其弊病,有时候首屏加载慢的让人捏舌 ...
- Vue 网站首页加载优化
Vue 网站首页加载优化 本篇主要讲解 Vue项目打包后 vendor.js 文件很大 如何对它进行优化 以及开启Vue的压缩 和 nginx gzip 压缩的使用, 其他就是对接口优化等 1. v ...
- vue cli3.0 首次加载优化
项目经理要求做首页加载优化,打包后从十几兆优化到两兆多,记下来怕下次忘记 运行report脚本 可看到都加载了那些内容,在从dist文件中index.html 查看首次加载都加载了那些东西,如下图:然 ...
- react 首屏加载优化
react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...
- Webpack按需加载一切皆模块
前言 在学习 Webpack 之前,我们需要了解一个概念:模块. 何为模块? 如果你曾学过 Java , C# 之类的语言,一定会知道 Java 中的 import 或 C# 中的 using 吧? ...
- vuejs学习之 项目打包之后的首屏加载优化
vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...
随机推荐
- 确定协议-通过分析系统阶段需要知道该系统能不能进行性能测试-Omnipeek
- windows资源监控常用计数器解释
随笔有些是自己写的,有些是根据网上的东西自己整理的,文章基本都是别人的,只是为方便查看复制到那里
- BNUOJ 35759 The Great Pan
The Great Pan Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...
- Win 2003 创建 IP 安全策略来屏蔽端口的图文教程
(本文用示例的方法讲解 IP 安全策略的设置方法,具体的设置还是要根据个人实际的需要来设置.另外 Windows Server 2008 与此类似.千一网络编辑注) IP安全性(Internet Pr ...
- sed和awk的常用实例
一.文本间隔 1.在每一行后面增加一空行 sed G guo.sh awk '{printf("%s\n\n",$0 ) }' 2.将文件中原来的空行删掉,并在在每一行后边增加一空 ...
- HDU1811 并查集+拓扑排序
题目大意: 判断是否能根据给定的规则将这一串数字准确排序出来 我们用小的数指向大的数 对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号 #includ ...
- HDU 4745 最长回文子序列
题目大意 两只青蛙朝不同方向条,每次都到达值相同的位置,不能重复到达自己到过的地方,且不能飞跃已到过的地方 我们可以理解为这两只青蛙分别把整个序列遍历了一遍,依次走过所有的点,找到最多相同的点的个数, ...
- fastcgi与cgi的区别[转载]
cgi 在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序 (或per ...
- PHP 关键词
PHP 关键词 TCP 传输层通信协议 面向连接的.可靠的.基于字节流的 建立链接需要三次握手 Socket(套接字) 一个工具,一个接口 封装了TCP/IP协议 建立长链接的基础 HTTP 一个应用 ...
- dtrace.org
http://dtrace.org/blogs/rm/2016/09/15/turtles-on-the-wire-understanding-how-the-os-uses-the-modern-n ...