webpack性能优化不完全指北

  前语--最近公司新开了一个项目,对webpack的性能上产生了不小需求,在一通学习了webpack之后特意写一篇来总结一下。 

本文涉及的内容


体积优化

  • 依赖按需加载
  • 剔除不必要的依赖
  体积的大小直接关系到我们项目的加载速度, 而SPA的首屏加载速度又决定了用户的留存。对于体积优化,我们可以从俩个方面来下手。 But 在那之前我们要先对自己的项目依赖构成进行分析,确定了优化的目标才能着手思考优化方案,进而实施优化方案。


对于项目bundle的分析,我们可以借助 webpack-bundle-analyzer 


食用方法:

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

module.exports = {
    plugins: [
       new BundleAnalyzerPlugin()
    ]
}

我们只需要在每次打包的时候使用它,可以通过判断NODE_ENV === 'production' 来选择是否要开启该插件。同类型的插件还有 webpack-analyse 和 webpack-chart, 更炫酷(雾)一些不过额外要配置下。运行下面的命令生成分析工具需要的json文件。

webpack --profile --json > stats.json

// 如果,运行指定的 weboack 文件,可用此命令
webpack --config build/webpack.prod.conf.js  --profile --json > stats.json


擒贼先擒王

  有了依赖分析图,我们就知道哪些模块是导致我们性能存在瓶颈的罪魁祸首,必不可缺的依赖我们可以考虑是否有按需加载的可能, 没有必要或者功能重复的依赖我们就可以将它剥离。


① 按需加载

  一是将所使用的库按需加载,比如一个UI库小至100K,大至上MB。我们通常不会使用她所有的组件而是只使用其中一部分,这时就可以将所使用的组件提取出来,而不打包没有使用到的多余组件。

在我们导入组件库的时候不使用--

这种引入方式会导致将整个组件库都导入进来,得不偿失。


正确的食用方法--


在引入需要的组件时都只将该组件引入进来,而不使用解构。

but 这样是不是特别麻烦,每次引入文件都需要去对应的文件下面导入文件。特别是通常组件库都是我们通过npm下载下来的,都放在node_modules下面。非常不利于我们准确的找到需要的组件。so 我们可以使用 babel-plugin-import 来帮我们自动完成。这样使用第一种引入方式也不会将所有的组件都导入进来。


  二是将代码分块(chunk), 实现代码层面上的按需加载--

  使用webpack的Code splitting来实现, 具体展开来讲篇幅过长。直接 webpack的 Code splitting 实现按需加载But 这是一种过时的方法-- 我们在webpack导入对应的模块可以使用ES6 的import()。将代码动态拆分。 webpack动态导入


Tips: Scope Hoisting

  这个是webpack自带的一个插件,只需在配置文件中添加一个新的插件,就可以让 Webpack 打包出来的代码文件更小、运行的更快。  但是经过我测试效果微乎其微,选装。

webpack Scope Hoisting介绍

食用方法--



构建速度

  • 首次编译构建速度
  • 热重载构建速度(rebuild)

  项目工程的构建速度决定我们能不能 happy coding,长足的构建速度也能加快我们的开发进度。在构建速度上主要分为俩个优化方面--


① 首次编译构建速度

HappyPack加速构建

  总所周知,JS是单线程的,而node在不展开cluster的情况下也是默认单线程的。单线程的优势这里不详谈,happypack可以让 Webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威 力,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。大大提升了编译的速度.

食用方法--


happypack的处理思路是将原有的webpack对loader的执行过程从单一进程的形式扩展多进程模式,原本的流程保持不变,这样可以在不修改原有配置的基础上来完成对编译过程的优化。


打包DLL抽离公共类库

通过前置依赖包使得不常更新的包不参与打包来提升构建速度,只需要build自己的业务代码。这样就能省下公共资源和公共依赖的打包时间,大大加快构建速度。

食用方法--


像是通过前置依赖和缓存依赖的方法还有 ExternalsCommonsChunk


② 热重载构建速度(rebuild)

快速的rebuild速度能够在开发中带来更多的幸福感,在这一方面我们可以借助webpack的cache(默认开启),babel的cache,happypack的cache。

babel.cache--


使用babel将代码编译成es5的时候,可以使用exclude和include限定babel和排除node_modules下的下赖来提升构建速度。


happypack.cache--



打包速度优化

如果在体积优化和构建方面都做到位了,打包时的速度其实就会非常的快乐。而我们在打包时能做的优化其实前面都做得差不多了,

在这步最多对文件压缩(webpack-parallel-uglify-plugin)和文件搜索目录深度(resolve-modules)进行一些优化。这里就不再过多赘述了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Webpack是一个现代化的前端打包工具,它可以将多个模块打包成一个或多个静态资源文件。在项目开发过程中,随着代码规模的增大,Webpack性能优化变得尤为重要。以下是一些Webpack性能优化的方法: 1. 减少打包文件体积: - 使用Tree Shaking:通过ES6模块的静态分析,去除未使用的代码,减少打包文件体积。 - 使用Code Splitting:将代码拆分成多个小块,按需加载,减少初始加载时间。 - 压缩代码:使用UglifyJS等工具对代码进行压缩,减小文件体积。 2. 加快构建速度: - 使用缓存:通过配置缓存选项,将构建过程中的中间结果缓存起来,加快下次构建速度。 - 多进程/多实例构建:使用工具如HappyPack或thread-loader,将任务分解到多个子进程或实例中并行处理,提高构建速度。 - 使用DllPlugin:将第三方库等不经常变动的模块提前打包成静态资源,减少每次构建的时间。 3. 优化文件加载: - 使用CDN:将静态资源部署到CDN上,加快文件加载速度。 - 使用缓存策略:配置合适的缓存策略,使浏览器能够缓存静态资源,减少重复加载。 - 按需加载:使用动态import或异步组件等方式,按需加载模块,减少初始加载时间。 4. 配置优化: - 减少不必要的插件和loader:只加载必要的插件和loader,减少构建过程中的处理时间。 - 使用resolve.alias:配置别名,减少模块查找时间。 - 使用externals:将一些不需要打包的模块通过externals配置引入,减小打包体积。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值