• 记录一次网站优化的经历


    一、背景

    清明假期后,产品跟我们反应,网站打开速度太慢,特别是弱网情况下,打开要好几分钟,公司因为是千M网络,所以感觉不出来。于是开始了我们的优化。

    二、工具

    使用ctrl+f5强刷状态测试,在f12里可以更改请求的网络速度,在下方可以看到请求数,请求资源大小以及dom构建完成时间以及最终加载完成的时间

    三、优化处理

    1.缩小打包体积

    我们发现打包chunk-vendors体积太大,有2.5M,于是,把一些依赖,如eCharts之类的拆出来,使用cdn引入,最终删减为900多k

    本来在网上查阅资料发现可以使用webpack配置项 externals,我们项目使用的是vue-cli3,我尝试配置,未能成功

    2.开启gzip

    安装compression-webpack-plugin,打包为gz格式,服务器开启gzip。

    vue.config.js中添加如下配置:

    const CompressionWebpackPlugin = require('compression-webpack-plugin');
    const productionGzipExtensions = ['js', 'css'];
    const isProduction = process.env.NODE_ENV === 'production';
    module.exports = {
        configureWebpack: config => {
            // gzip
            if (isProduction) {
                config.plugins.push(new CompressionWebpackPlugin({
                  algorithm: 'gzip',
                  test: new RegExp('\.(' + productionGzipExtensions.join('|') + ')$'),
                  threshold: 10240,
                  minRatio: 0.8
                }))
            }
        },
    }
    

    打包后chunk-vendors体积变为200多k,其余js文件也相应缩小

    3.减少请求数

    之前使用了路由懒加载,每个路由都使用了一个单独的webpackChunkName名称,导致打包后生成的js与css文件过多,现在将同一类型的页面使用相同的名字。

    4.压缩图片

    将一些很大的图片进行压缩,传送门: 图片压缩
    将一些尺寸很大的图片缩小,传送门: 缩小图片尺寸

    5.查找打包太大的原因

    在vue.config.js中加入如下配置,可以查看打包引入的文件

    chainWebpack: config => {
        config
        .plugin('webpack-bundle-analyzer')
        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
    },
    

    我发现我其中一个很简单的页面里却有好几M的内容引入,于是进行排查,发现下面这行代码:

    异常代码

    这行导致这个页面打包变的很大,去掉就行了。

    6.js文件延后

    将index.html界面引入的js文件加上defer="defer",同时挪到body外,让打包后的js先加载,保证页面是最先展示出来的

    7.ajax请求延后

    将请求很多的界面里原来写在created阶段的请求挪到mounted,防止请求过多影响界面显示

    优化对比

    优化前 优化后
    请求数 100 57
    资源大小 7M 2.9M
    首次内容渲染 5.82s 320ms

    后话

    纸上得来终觉浅,绝知此事要躬行,古人诚不欺我,很多优化措施,网上文章大堆,以前也阅读过不少,但是只有亲身实践后印象才会更加深刻。

    上次看到一句话,说

    github上真正的项目star不多,各种技术文章star却很多。

    确实,我自己也是,很浮躁,只想看,不肯动,却又想技术进步,这就不太善咯。

  • 相关阅读:
    面向过程--面向对象
    shiro有哪些组件?
    Redis的特点什么是?
    Spring Boot 有哪些优点?
    什么是 JavaConfig?
    HashMap和Hashtable的区别
    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
    Linux指令--tar,gzip
    JQuery 学习总结及实例
    $(this) 和 this 关键字在 jQuery 中有何不同?
  • 原文地址:https://www.cnblogs.com/wangxi01/p/12674303.html
Copyright © 2020-2023  润新知