当前位置: 首页 > article >正文

Webpack前端工程化进阶系列(二) —— HMR热模块更新(图文+代码)

前言


之前更新过一篇Webpack文章:Webpack入门只看这一篇就够了(图文+代码),没想到颇受好评,很快就阅读量就破万了hhh,应读者私信的要求,决定继续更新Webpack进阶系列的文章!

进入今天的主题 —— HMR

热模块替换(HotModuleReplacement)


开发时我们修改了其中一个模块代码,Webpack 默认会将所有模块全部重新打包编译,速度很慢。所以我们需要做到修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模块不变,这样打包速度就能很快。

HotModuleReplacement (HMR/热模块替换) 的作用就是在程序运行中,替换、添加或删除模块,而 无需重新加载整个页面

使用场景


在这里插入图片描述
如上图所示,一个注册页面包含用户名、密码、邮箱三个必填输入框,以及一个提交按钮,当你在调试邮箱模块改动了代码时,没做任何处理情况下是会刷新整个页面,频繁的改动代码会浪费你大量时间去重新填写内容。预期是保留用户名、密码的输入内容,而只替换邮箱这一模块。这一诉求就需要借助webpack-dev-server热模块更新功能。

相对于live reload整体刷新页面的方案,HMR的优点在于可以保存应用的状态,提高开发效率。

代码实操


热替换只能用于开发环境,生产环境是不需要的,且开发环境中hot配置默认是开启的。

// webpack.dev.js
  devServer: {
    host: "localhost", // 启动服务器域名
    port: "3000", // 启动服务器端口号
    open: true, // 是否自动打开浏览器
    hot: true, // 开启HMR功能
  },

hot:true的情况下运行开发环境,如下更改css的时候可以看到页面并没有刷新,而只是对更改的css进行了解析,因为我们在开发模式下使用的style-loader实现了这一功能,这就是热模块替换

在这里插入图片描述

虽然css实现了热模块替换,但JS还没有实现,更改JS文件进行保存还是会刷新页面重新打包编译,JS实现热模块替换还需要进行下面的操作:

// src/main.js    
// 判断是否支持HMR功能    
if (module.hot) {    
  module.hot.accept("./js/count.js");    
}

加上这个count.js改变之后就会进行热模块替换,如果其他文件也需要进行热模块替换也是需要加上module.hot.accept("");进行设置。

module.hot.accept("./js/count.js",function(){});还可以接收一个函数,这个函数就是当触发热替换的时候就会自动调用这个函数

当然,如果文件很多的话会很麻烦,在实际开发中会使用其他的loader来解决这个问题,比如vue-loader

原理


在这里插入图片描述
如上图所示,右侧Server端使用webpack-dev-server去启动本地服务,内部实现主要使用了webpackexpresswebsocket

  • 使用express启动本地服务,当浏览器访问资源时对此做响应。

  • 服务端和客户端使用websocket实现长连接

  • webpack监听源文件的变化,即当开发者保存文件时触发webpack的重新编译。

  • 每次编译都会生成hash值、已改动模块的json文件、已改动模块代码的js文件,编译完成后通过socket向客户端推送当前编译的hash

  • 客户端的websocket监听到有文件改动推送过来的hash戳,会和上一次对比一致则走缓存,不一致则通过ajaxjsonp向服务端获取最新资源

  • 使用内存文件系统去替换有修改的内容实现局部刷新

oneOf


在运行打包代码时每个文件都会经过所有loader处理,虽然因为test正则原因实际没有处理上,但是都要走,如果loader和文件很多,那就会大大拖慢打包文件的速度,那么就可以使用oneOf,也就是只能匹配上一个 loader, 只要匹配到了剩下的就不匹配了。

使用:
我们只需要在生产环境和开发环境的配置中将所有的规则像下面这样包起来就可以了:

rules:[
    {
        oneOf:[
            将原本卸载rules:[]的规则放进来!
        ]
    }
]

完成上面的操作之后分别在开发模式和生产模式进行一次代码的打包,测试一下打包是否可以成功,成功则说明配置是正确的,虽然能优化的速度有限,但蚊子再小也是肉也是不错的!


http://www.kler.cn/a/411185.html

相关文章:

  • 国土变更调查拓扑错误自动化修复工具的研究
  • QML学习 —— 29、3种不同使用动画的方式(附源码)
  • C 语言学习-06【指针】
  • 数学建模_基于对数和傅里叶变换的多通道图像增强模型(处理模糊)Matlab代码包教会使用,直接替换数据即可
  • ARM CCA机密计算安全模型之概述
  • 使用java模拟记录软件免费试用次数
  • SpringBoot整合RabbitMQ应用
  • 避坑ffmpeg直接获取视频fps不准确
  • CBK7运营安全
  • C语言学习 12(指针学习1)
  • 图像小波去噪与总变分去噪详解与Python实现
  • C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
  • 【pyspark学习从入门到精通19】机器学习库_2
  • 第六届国际科技创新学术交流大会暨新能源科学与电力工程国际(NESEE 2024)
  • Scala文件读写——成绩分析
  • 【AI绘画】Midjourney进阶:色调详解(上)
  • pyshark安装使用,ubuntu:20.04
  • QT6学习第四天
  • PAT甲级-1145 Average Search Time
  • C# 结构体
  • C#基础练习61-65
  • MMCM DRP动态配置方法(超详细讲解)
  • Spring Boot 3.4 正式发布,结构化日志!
  • 【Redis篇】String类型命令详讲以及它的使用场景
  • 互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?
  • 实战项目负载均衡式在线 OJ