Create-react-app17_webpack4 优化

1,213 阅读3分钟

脚手架版本 17

打包文件分析

插件 source-map-explorer(官方推荐~)

在package.json文件中添加命令,这里有一个注意点就是(如果将source-map文件删除掉将无法进行打包分析)

image.png

运行 npm run analyze 就会打开一个网页,注意看网页中的包体积大小,针对优化
这一步很重要~~~~~~~~~~

build中显示打包时间总长

打开scripts > build.js > build函数

 const compiler = webpack(config); // 这个compiler中会包含打包时间
 // 正确的来说是他run的时候回调第二个stats参数会包含,第一个是err

 // 我写在了这个return上面~~ 位置不是固定的,随意~显示方式根据个人喜好来决定它如何显示~
 console.log('time:', parseFloat((stats.endTime - stats.startTime) / 1000))
 return resolve(resolveArgs);

plugin or loader耗时分析

插件 speed-measure-webpack-plugin;

const SpeedMeasurePlugin=require('speed-measure-webpack-plugin');
const smp = new SpeedMeasurePlugin();

直接裹! image.png

运行npm run build,就可以在终端中看到耗时了~

source map文件删除

打包完毕后发现build文件很大且多出来了很多Source map文件,
这个map文件有优点也有缺点具体的可以去看各个博客看一下,
优点

  • 主要是帮助精准定位错误

缺点

  • 体积占用很大
  • 如果有sentry监控系统的话,将sourmap文件删除掉,将不会显示报错具体行数及具体报错代码

需要保存还是去掉的话具体还是要看项目取舍~~

  • 如果想要去控制生产环境不build映射文件,dev环境build映射文件,搜索shouldUseSourceMap,然后添加到对应的环境变量去控制~

  • 在浏览器的Sources中可以看到源码,不想让用户看到源码可以去掉source-map文件

本人去掉source map后项目体积减少了百分之五十七

打开webpack.config.js, 搜索 devtool

devtool: isEnvProduction 
        ? shouldUseSourceMap
           ? 'source-map'
           : false
        : isEnvDevelopment && 'cheap-module-source-map'
        
 只需要将上面。 shouldUseSourceMap的这个三目运算符去掉,改成false就可以了

本地预压缩

插件 compression-webpack-plugin插件
作用: 在webpack打包过程中进行gzip压缩,服务器需要开启gzip压缩(webpack压缩有成本,项目不大的话,build体积会增加)
好处:减少服务器部分压力,进而转换到个人电脑,如果服务器发现同名的.gz会主动读取,不会主动压缩,优化了服务器性能

如果在6x以上的话会导致报错 tapPromise of undefined,挨个版本降级,到6x就没问题了

请求gzip文件原理,两个字段

  • Accept-Encoding: gzip, deflate,br
  • content-encoding: gizp

浏览器发起请求的时候默认Request Headers里面有一个字段 Accept-Encoding: gzip, deflate,br。
意思是希望这个请求内容被压缩,减少网络流量,但是这个不是强制的

如果服务器支持压缩或者开启压缩,则会在响应头中增加字段。content-encoding: gizp

更多配置请移步文档~

 new CompressionPlugin({
        filename: '[path].gz[query]',
        algorithm: 'gzip', //  brotliCompress 还有一种这个算法 谷歌提供的,比gzip优异,但是gzip经过了验证~
        test: /\.(js|css|html|svg)$/,
        threshold: 6144,
        minRatio: 0.8, // 比这个小的 压缩率 = 压缩后的大小 / 原始大小
        deleteOriginalAssets: false, // 是否删除原始资源。
      }),

开启缓存

loader: babel-loader

为什么要开启缓存,可能会生成一些运行期间重复的公共文件,造成代码体积大冗余,同时也会减慢编译效率 babel-loader默认缓存目录:node_modules/.cache/babel-loader,找不到的话,将会降级回退到操作系统默认的临时文件目录。

当设置了缓存之后,二次打包将会得到大幅度提升

option:{
   cacheDirectory: true,
}

多进程打包(webpack版本<4的可以使用~)

插件 HappyPack

image.png

大意是说webpack4性能在已经提高了,这个插件作用对于webpack4不是很明显,作者对这个项目的兴趣正在降低,如果有人想接手,随时联系他就可以

webpack4推荐使用 thread-loader进行多进程打包

这里有一个注意的点就是,thread-loader会对后面的loader进行多进程打包,由于其启动成本比较昂贵(600ms左右),不要滥用~

比如我这个是针对babel-loader进行的多进程打包(开启了babel的缓存,皆为二次打包) image.png

开启前为11.315秒 image.png

开启后为13.539秒 image.png

进行了一波负优化,如项目没有大到一定的地步可以不要使用~
使用情况要根据项目实际情况进行优化

多进程压缩JS

插件:terser-webpack-plugin(内置了~~)

模块化引入

原来的引入方式
import { get } from 'lodash'

// 模块化
import get from 'lodash/get'

image.png image.png