更新于 

WebPack

编译流程

  • 创建Compiler编译对象
  • 初始化入口,解析入口文件,构建依赖树
  • 确定编译环境
  • 初始化内部解析
  • 开始对文件进行编译
  • 对每个模块创建Compilation,Compilation会对依赖树的模块进行编译,可以在编译期间被加载、封存、优化、分块、重新创建
  • 编译结束
  • 输出文件
  • 编译完成

编译优化

优化分析

  • 体积分析:webpack-bundle-analyzer
  • 速度分析:speed-measure-webpack-plugin
  • 日志分析:webpack —status

优化方案

  • 使用dllPlugin
  • babel-loader添加cacheDirectory
  • 使用thread-loader优化loader
  • 使用高版本node和webpack
  • 开启tree shaking和scope hoisting
  • webpack5配置长缓存
  • 使用css-minimizer-webpack-plugin压缩css
  • 使用terser-webpack-plugin压缩js,并去掉无用的js
  • webpack5的module-federation
  • split chunks 分包

HMR

  • webpack-dev-server在启动的时候会给entry去注入webpack/hot/dev-server
  • 注入webpack-dev-server/client/index.js
  • 判断是否存在webpack.HotModuleReplacementPlugin(作用:这个插件会注入一个module.hot的一个对象,该对象提供了一些方法,用于更新)
  • 监听webpack hooks的compile(编译)、done(编译成功)、invalid(编译失败)钩子
  • 初始化express、webpack-dev-middleware
  • 启动express、socket服务

    📌socket服务主要是用于监听一些特定的事件进行更新处理

  • webpack-dev-middleware会以watch的形式监听文件更改,当文件发生变化的时候,会生成xxx.hot-update.js(当前的文件)和xxx.hot-update.json(下次更改的hash),调用location.reload