优化我的网站

1,235 阅读3分钟

优化原因:之前自己的个人博客地址是放在google云的,emm...,实在太贵了,又转到了阿里云,一直以来都知道访问比较慢,想着是 qiang 的问题,就没管它,直到前几天我搬到阿里云之后一打开发现还是慢的一匹,所以就有了这次的优化

优化前:

下边的评分使用的是 speedpage,当然也可以使用chrome devtools => Lighthouse

具体使用可以参考这篇文档

stage1

 查看都下载了些什么东西这么大,除去react-devtools和testing-library这两个插件的东西和埋点的代码,自己的也就两个js文件和两个css文件

使用webpack的分析工具很轻松就可以看到打包之后都有些什么

  webpack --analyze

可以看到moment的local非常大,而且我也没有用到,再有就是只有两个js文件,完全浪费了浏览器的性能

优化:

1. 优化moment

  + const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
  + new MomentLocalesPlugin(),

还有一些其他的webpack打包优化可以参考这篇文档,例如moment时区的优化,lodash的等

2. dll分包

        new webpack.DllReferencePlugin({
		
            manifest: path.resolve(__dirname, '../dll/manifest.json'),
		
        }),
		
        new AddAssetHtmlWebpackPlugin({
		
            filepath: path.resolve(__dirname, '../dll/vendor.js'),
		
            publicPath: '/dll',
		
        }),

webpack.dll.js

      module.exports = {
          mode: 'production',
          entry: {
              vendor: ['react', 'react-dom', 'react-router', 'react-router-dom'],
          },
          output: {
              filename: '[name].js',
              path: path.resolve(__dirname, '../dll'),
              library: '[name]_[hash:10]',
          },
          plugins: [
              new Webpack.DllPlugin({
                  name: '[name]_[hash:10]',
                  path: path.resolve(__dirname, '../dll/manifest.json'),
              }),
          ],
      };

3. 抽离moment,lodash

            cacheGroups: {
                lodash: {
                    test: /[\\/]node_modules[\\/]lodash/,
                    priority: 1,
                    reuseExistingChunk: true,
                },
                moment: {
                    test: /[\\/]node_modules[\\/]moment/,
                    priority: 1,
                    reuseExistingChunk: true,
                },
                // antd: {
                //     test: /[\\/]node_modules[\\/](antd)|(@ant-design\/icons).*/,
                //     priority: 1,
                //     reuseExistingChunk: true,
                // },
            },

ps:其实这里也想把antd抽离出去,但是发现这样写了之后antd的每个模块都被抽离成了一个单独的文件

4. 压缩banner

这里就不展示效果了,结果肯定好了很多,但是感觉仍不满意,原因主要是首屏加载了很多没用的代码,例如在后台使用的 antd-table、antd-menu、quilljs(大头)等等

stage2

 路由懒加载,进一步拆分文件,尽量在首屏只加载有用的代码

      const FontLoader = loadable({
          loader: () => import('./pages/font/home/index'),
          loading: Loading,
      });
      
      
      const AdminLoader = loadable({
          loader: () => import('./pages/admin/layout/index'),
          loading: Loading,
      });
      const LoginLoader = loadable({
          loader: () => import('./pages/login/index'),
          loading: Loading,
      });

这里需要注意的一点是,此时网站加载速度比较快了,再使用一个比较大的loading的gif反而会导致速度变慢,屏幕会闪一下loading,所以这里给的是一个空的标签,给出了100vh 和 100vw的宽高(这样高度的原因是为了保持视觉稳定性-----得分,ps:正常情况下说的视觉稳定性指的是给img图片设置宽高)

stage3

再次查看性能指标,还有两项可以优化

增加 nginx 配置

# gzip 配置信息
# http://nginx.org/en/docs/http/ngx_http_gzip_module.html
# 开启 gzip 压缩
gzip on;
 # gzip 缓冲区 大小 使用默认值即可
#gzip_buffers 32 4k|16 8k;;
# gzip 压缩级别 级别越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大
gzip_comp_level 3;
# gzip 压缩文件大小(字节) 大于该值的文件都会被压缩
gzip_min_length 200;
# gzip 压缩文件类型 MIME类型 text/html 默认压缩
gzip_types application/javascript text/css image/jpeg;
# 设置 Vary 响应头
gzip_vary on;

使用webp格式图片并压缩

优化后

最后我变成了  快男

个人的博客网站,搞着玩一下子,有什么不足欢迎大家指出,地址: www.sunbohao.com/

下一步打算搞个带有ssr功能的构建工具,搞成ssr的形式