项目优化措施全面总结

一、体积层面

1、 图片压缩

这个网站压缩的图片肉眼看不出变化,不会变模糊 压缩图片网址 https://tinypng.com/

2、图片选择

PC端图片大小与实际大小一致

移动端图片用2倍图

3、 Gzip压缩代码

(准备将配置加入到脚手架,推荐此方法,效果比较明显)

下载依赖

npm i compression-webpack-plugin@5.0.1 –D

constCompressionWebpackPlugin = require('compression-webpack-plugin');
constprodGzipList = ['js', 'css'];
...

const webpackConfig = (memo, { env, webpack, createCSSRule }) => {
  
  if (env === 'production') {
    // 生产模式开启
    memo.plugin('compression-webpack-plugin').use(
      new CompressionWebpackPlugin({
        // filename: 文件名称,这里我们不设置,让它保持和未压缩的文件同一个名称
        algorithm: 'gzip', // 指定生成gzip格式
        test: new RegExp('\.(' + prodGzipList.join('|') + ')$'), // 匹配哪些格式文件需要压缩
        threshold: 10240, //对超过10k的数据进行压缩
        minRatio: 0.6, // 压缩比例,值为0 ~ 1
      })
    );
  }
};

打包后dist目录下会出现压缩过的文件

nginx配置文件添加一行配置

gzip_static on;

4、分包

分割各个模块代码,提取相同部分代码

/**
 * memo,当前 webpack-chain对象
 * env,当前环境,development、production 或 test 等
 * webpack,webpack 实例,用于获取其内部插件
 * createCSSRule,用于扩展其他 CSS 实现,比如 sass, stylus
 * @param {*} memo
 * @param {*} { env, webpack, createCSSRule }
 */
const webpackConfig = (memo, { env, webpack, createCSSRule }) => {
  // 分包
  memo.optimization.splitChunks({
    chunks: 'all',
    automaticNameDelimiter: '.', // 文件名分隔符
    name: true,
    minSize: 30000,
    maxSize: 0, 
    minChunks: 1,
    maxAsyncRequests: 10,
    maxInitialRequests: 5,
    cacheGroups: {
      antd: {
        name: 'antd',
        chunks: 'all',
        test: /(antd|@ant-design|dynamic-antd-theme)/,
        priority: 10,
      },
      lodash: {
        name: 'lodash',
        chunks: 'all',
        test: /(lodash|lodash-decorators)/,
        priority: 10,
      },
      echarts: {
        name: 'echarts',
        chunks: 'all',
        test: /(echarts)/,
        priority: 11,
      },
      vendors: {
        name: 'vendors',
        chunks: 'all',
        test: /(moment|react-dom|axios|zrender|immutable|redux|redux-saga|dva|qs|draft-js|fbjs)/,
        priority: 11,
      },
      rcVendors: {
        name: 'rcVendors',
        chunks: 'all',
        test: /(rc-)/,
        priority: 11,
      },
    },
  });
};
5、良好的编码习惯

组件化;封装公用函数、使用公用变量、className,减少重复代码;使用简洁的写法;

6、按需引入组件库插件

使用这样的写法 import isEqual from 'lodash/isEqual';

使用 babel-plugin-import

npm i -D babel-plugin-import

7、tree shaking

webpack4默认开启

参考文章

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyczoFxg-1661423040672)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5a5c0cd7abd8427abf736bb8960fb195~tplv-k3u1fbpfcp-zoom-1.image)]

8、CDN链接代替依赖包

CDN技术:分布式的内容分发网,将用户的访问指向离用户最近的工作正常的流媒体服务器

公司没有,用别人的CDN链接,似乎安全检查的时候会提示有风险,可能会有不稳定的情况(不太推荐用)

9、使用通用样式

公用less,css选择器层级不要太深

二、速度层面

1、页面按需加载
2、缓存
  • 通过HTTP的META设置expires和cache-control
<meta http-equiv="Cache-Control" content="max-age=7200" />
<meta http-equiv="Expires" content="Sun Oct 15 2017 20:39:53 GMT+0800 (CST)" />
  • 通过nginx
3、渲染层面

CSS策略

  • 避免出现超过三层的嵌套规则
  • 避免为ID选择器添加多余选择器
  • 避免使用标签选择器代替类选择器
  • 避免使用通配选择器,只对目标节点声明规则
  • 避免重复匹配重复定义,关注可继承属性 (font,text-align,color,line-height等)

DOM策略

  • 缓存DOM计算属性
  • 减少DOM节点
  • 避免过多DOM操作
  • 使用DOMFragment缓存批量化DOM操作

阻塞策略

  • 脚本与DOM/其它脚本的依赖关系很强:对

回流重绘策略

  • 缓存DOM计算属性
  • 使用类合并样式,避免逐条改变样式
  • 使用display控制DOM显隐,将DOM离线化

针对react

  • 列表绑定key
  • 不必要的dom节点用<></>
  • 能不放到render里面的处理和声明都不要放
  • 使用函数类型的组件
4、性能、体验

使用memoizeOne,减少计算。只要输入的内容和上一次一样,就不会再次计算,直接用上一次的结果。

防抖节流

5、去掉控制台打印

使用 transform-remove-console

6、使用http2

好处请看这里 http2.0

前提条件

1、openssl的版本必须在1.0.2e及以上,在 Chrome 51后,谷歌去掉了对 NPN 的支持,HTTP2不能用了会证书错误,而openssl1.0.2e之后的版本修复了此问题

2、开启https加密,目前http2.0只支持开启了https的网站

3、nginx的版本必须在1.9.5以上,原因是nginx从1.9.5开始,已经用 http_v2_module 模块替换了 ngx_http_spdy_module

详情


7、移动端做图片上传可以考虑先压缩图片

压缩图片插件 compressorjs

/**
   * 压缩图片
   * @param {*} image 图片文件
   * @param {*} backType 返回类型,file文件,blob
   * @param {*} quality 压缩质量0-1,数字越小图片被压缩得越小
   * @returns
   */
  compressorImage = (image, quality = 0.8, backType = 'file') => {
    return new Promise((resolve, reject) => {
      new Compressor(image, {
        quality,
        success(result) {
          const file = new File([result], image.name, { type: image.type });
          if (backType == 'blob') {
            resolve(result);
          } else {
            resolve(file);
          }
        },
        error(err) {
          console.log('图片压缩失败---->>>>>', err);
          reject(err);
        },
      });
    });
  };

三、其他

1、项目启动优化

webpack.config.js

使用缓存memo.cache(true);

2、分析工具

npm run analyze 查看包的大小,将没用到的东西删掉。

使用lighthouse分析,谷歌浏览器有。

欢迎评论交流

❤️ 更多前端知识欢迎关注公众号交流
❤️ 这里有你想知道的web前端知识

名称:你想知道的web前端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值