之前项目多,事情忙,一直没时间写博客,现在空闲下来了,总结一下

之前讲过了关于 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 及 加载优化的更多相关文章

  1. 再谈javascript图片预加载技术

    图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展 ...

  2. vue项目首屏加载优化实战

    问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...

  3. Vue SPA 首屏加载优化实践

    写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...

  4. vue加载优化策略

    vue.js是一个比较流行的前端框架,与react.js.angular.js相比来说,vue.js入手曲线更加流畅,不管掌握多少都可以快速上手.但是单页面应用也都有其弊病,有时候首屏加载慢的让人捏舌 ...

  5. Vue 网站首页加载优化

    Vue 网站首页加载优化 本篇主要讲解 Vue项目打包后 vendor.js 文件很大 如何对它进行优化 以及开启Vue的压缩 和 nginx gzip 压缩的使用, 其他就是对接口优化等  1. v ...

  6. vue cli3.0 首次加载优化

    项目经理要求做首页加载优化,打包后从十几兆优化到两兆多,记下来怕下次忘记 运行report脚本 可看到都加载了那些内容,在从dist文件中index.html 查看首次加载都加载了那些东西,如下图:然 ...

  7. react 首屏加载优化

    react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...

  8. Webpack按需加载一切皆模块

    前言 在学习 Webpack 之前,我们需要了解一个概念:模块. 何为模块? 如果你曾学过 Java , C# 之类的语言,一定会知道 Java 中的 import 或 C# 中的 using 吧? ...

  9. vuejs学习之 项目打包之后的首屏加载优化

    vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...

随机推荐

  1. 确定协议-通过分析系统阶段需要知道该系统能不能进行性能测试-Omnipeek

  2. windows资源监控常用计数器解释

    随笔有些是自己写的,有些是根据网上的东西自己整理的,文章基本都是别人的,只是为方便查看复制到那里

  3. BNUOJ 35759 The Great Pan

    The Great Pan Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...

  4. Win 2003 创建 IP 安全策略来屏蔽端口的图文教程

    (本文用示例的方法讲解 IP 安全策略的设置方法,具体的设置还是要根据个人实际的需要来设置.另外 Windows Server 2008 与此类似.千一网络编辑注) IP安全性(Internet Pr ...

  5. sed和awk的常用实例

    一.文本间隔 1.在每一行后面增加一空行 sed G guo.sh awk '{printf("%s\n\n",$0 ) }' 2.将文件中原来的空行删掉,并在在每一行后边增加一空 ...

  6. HDU1811 并查集+拓扑排序

    题目大意: 判断是否能根据给定的规则将这一串数字准确排序出来 我们用小的数指向大的数 对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号 #includ ...

  7. HDU 4745 最长回文子序列

    题目大意 两只青蛙朝不同方向条,每次都到达值相同的位置,不能重复到达自己到过的地方,且不能飞跃已到过的地方 我们可以理解为这两只青蛙分别把整个序列遍历了一遍,依次走过所有的点,找到最多相同的点的个数, ...

  8. fastcgi与cgi的区别[转载]

    cgi 在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序 (或per ...

  9. PHP 关键词

    PHP 关键词 TCP 传输层通信协议 面向连接的.可靠的.基于字节流的 建立链接需要三次握手 Socket(套接字) 一个工具,一个接口 封装了TCP/IP协议 建立长链接的基础 HTTP 一个应用 ...

  10. dtrace.org

    http://dtrace.org/blogs/rm/2016/09/15/turtles-on-the-wire-understanding-how-the-os-uses-the-modern-n ...