查看请求的响应时间,所下载的文件资源的体积、加载解析时间消耗等
分析结果:
- 哪些文件,体积太大,下载慢,阻塞了其他资源下载
webpack-bundle-analyzer
,运行npm run build --report
,对打包后js文件的分析针对图片
,使用webpack中image-webpack-loader
解析器,在打包时压缩图片// install
npm i image-webpack-loader -D
// vue.config.js
chainWebpack: (config) => {
if (isProd) {
// 图片压缩处理
const imgRule = config.module.rule('images')
imgRule
.test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({ bypassOnDebug: true })
.end()
}
}
或者使用2010年谷歌浏览器提出的webP图片,同等质量下体积比png、jpg小很多。不过在html、css中使用时,与原来的写法不太一样。
HTML中使用,标签兼容
<picture>
<source srcset="hehe.webp" type="image/webp">
picture>
CSS中使用,需要配合JS做判断;------ 写法略
针对css文件进行压缩
,通过webpack中的 css-loader
解析器,对css文件进行压缩。针对js文件进行压缩
,通过webpack中的uglifyjs-webpack-plugin
插件,对js压缩,同时在打包时,可以去除代码中的console.log、debugger语句。const UglifyJsPlugin = require('uglifyjs-webpack-plugin') // 压缩js体积
// webpack中的配制
plugins:[
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false,
drop_debugger:true,
drop_console: true
}
}
}),
]
采用Tree Shaking
技术,对没有用到的插件、api不打包到最终打包后的文件中去,最新的Vue3、React都是支持Tree-Shaking 的。//webpack4.x中tree-shaking 配置
const config = {
mode: 'production', // 必须在开发环境中
optimization: {
usedExports: true, // production模式下默认为true
minimize: true // 默认为true
}
};
针对第三方组件库
,比如说Ant design of Vue、Element-ui组件库,进行优化;1、Ant中的icon是全量引入,但是有时候,我们可能只在项目中用了几个Ant内置的图标。目前了解到的方法如下:
(1)、使用 webpack-ant-icon-loader
插件;
(2)、重定向到本地文件来控制 (推荐),使用alias将将@ant-design/icons/lib/dist指向项目中的antd-icon.js,然后在antd-icon中按需导出即可
// alias配置
resolve: {
alias: {
'@ant-design/icons/lib/dist$': path.resolve(__dirname, './src/icons/antd-icon.js')
}
}
// src/icons/antd-icon.js
export { default as LoadingOutline } from '@ant-design/icons/lib/outline/LoadingOutline'
1、注意项目中和Ant组件中使用的ICON都要导出
2、优化后从530K+到30K+
Code Splitting
: 将代码按 路由维度
或者组件
分块(chunk),这样做到按需加载,同时可以充分利⽤浏览器缓存懒加载就是,当打开页面时,才去加载对应文件。
{
path: 'register',
name: 'register',
component:
() => import(
/* webpackChunkName: "user" */
'@/views/user/register'
),
}
请合理地用webpack的魔法注释,对路由进行分组,
太多的chunk会影响构建时的速度
通常浏览器在传输时,并发请求数是有限制的,超过限制的请求需要排队。
使用HTTP2协议后,其可以在一个TCP连接中,处理多个请求(多路复用),从而不受此限制。
如果网站支持HTTPS,一定要开启HTTP2,对于请求多的页面提升很大,尤其是在网速不佳时。
Nginx开启HTTP2
// nginx.conf
listen 443 http2;
nginx -s stop && nginx
HTTP2开启后,多路复用避开了资源并发限制,但资源太多的情况,也会造成浏览器性能损失。
Gzip压缩
,缩小TCP传输时js、css文件的体积Gzip压缩是一种强力压缩手段,针对文件通常能减少2/3的体积。
HTTP协议中用头部字段Accept-Encoding
和 Content-Encoding
对 「采用何种编码格式传输正文」进行了协定。
请求头的Accept-Encoding会列出客户端支持的编码格式。
响应头的 Content-Encoding指定了gzip时,浏览器则会进行对应解压
配制步骤如下:
在开启gzip之前,安装[email protected]
,在config/index.js中开启。
//在config/index.js中
// Before setting to `true`, make sure to:
// npm install --save-dev [email protected]
productionGzip: true,
productionGzipExtensions: ['js', 'css'],
打包后,文件中就会新增gz压缩文件;gz文件的体积比原文件体积小很多。
http:{
#开启和关闭gzip模式
gzip on;
#gizp压缩起点,文件大于1k才进行压缩
gzip_min_length 1k;
# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
gzip_comp_level 6;
# 进行压缩的文件类型。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript ;
# nginx对于静态文件的处理模块,开启后会寻找以.gz结尾的文件,直接返回,不会占用cpu进行压缩,如果找不到则不进行压缩
gzip_static on
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
}
vue开启gzip性能优化主要分为两部分,成功开启后将大大优化vue首页加载时长。
gzip 详情参考链接:https://www.cnblogs.com/guopengju/articles/12037257.html
link标签的rel属性的两个可选值。
用户未来的浏览有可能需要加载目标资源
,所以浏览器有可能通过事先获取和缓存对应资源,优化用户体验。用户十分有可能需要在当前浏览中加载目标资源
,所以浏览器必须预先获取和缓存对应资源。首屏字体、大图加载,CSS中引入字体需要等CSS解析后才会加载,这之前浏览器会使用默认字体,当加载后会替换为自定义字体,导致字体样式闪动,而我们使用Preload提前加载字体后这种情况就好很多了,大图也是如此。
Vue-Cli3默认会使用preload-webpack-plugin
对chunk资源做preload、prefetch处理,
入口文件preload,
路由chunk则是prefetch。
OSS,对象存储
海量,安全,低成本,高可靠的云存储服务
CDN,内容分发网络
CDN加速原理是把提供的域名作为源站,将源内容缓存到边缘节点。当客户读取数据时,会从最适合的节点(一般来说就近获取)获取缓存文件,以提升下载速度。
针对svg文件
,使用webpack中svg-sprite-loader
解析器,将加载的 svg 图片拼接成 雪碧图,放到页面中,其它地方通过
// 第一步,安装
npm i -D svg-sprite-loader
// 第二步,配制loader
loader:[
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
}
]
参考链接:https://www.jianshu.com/p/70f9c9268c83
首屏优化,在JS没解析执行前,让用户能看到Loading动画,减轻等待焦虑。
通常会在index.html上写简单的CSS动画,直到Vue挂载后替换挂载节点的内容。
首屏优化,APP内常见的,加载时满屏的灰色块状区域。
针对骨架屏页的自动化生成,可以采用draw-page-structure
插件。
参考链接:https://zhuanlan.zhihu.com/p/74403911
代码优化:https://blog.csdn.net/yiyueqinghui/article/details/108709870
hard-source-webpack-plugin
插件,利用缓存,提高打包与启动项目的速度;const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
moudles.exports = {
plugins: [
new HardSourceWebpackPlugin()
]
}
HappyPack
,进行多线程/多进程构建项目。本文参考链接:https://mp.weixin.qq.com/s/K0-rshveDBozkBJvJWR59g