Hot Module Replacement,热模块更新,很多时候会简写成HMR。
"scripts": {
  "start": "webpack-dev-server",
},

在加热更新之前,我们运行npm run start,会发现之前我们打包有个dist目录,为什么运行这个命令的时候,dist目录没有了。实际上,webpack-dev-server,还是会对src目录下进行打包的。但是打包生成的文件,他并不会放在dist目录下。而是放到电脑中的内存里面。这样的话,可以有效的提升打包的速度。让我们开发更快,所以不用担心。

index.js
var btn = document.createElement('button');
btn.innerHTML = '新增';
document.body.appendChild(btn); btn.onclick = function() {
  var div = document.createElement('div');
  div.innerHTML = 'item';
  document.body.appendChild(div);
}

这个js是点击一下新增,就新增一个item的div。现在我要实现一个样式的效果。偶数的时候给他加个背景

style.css
div:nth-of-type(odd) {
  background: yellow;
}
这个时候我把yellow改成blue。webpack-dev-server检测到代码对变化就会重新刷新,需要重新点击去测试。那之前好不容易点的东西没有了,又要重新点击,于是我就希望,当改变样式代码的时候,不要刷新页面,只要改变样式就行了,不要给我删除掉之前的dom。这个时候就用到了HMR
module.exports = {
  // 起个服务器
  devServer: {
    // 这个意思是服务器要生成在哪个文件夹下
    contentBase:'./dist',
    // 启动的时候自动打开浏览器,然后自动访问这个服务器地址
    open:true,
    // 开启Hot Module Replacement
    hot: true,
    // 即便hmr的功能没有生效,浏览器也不要自动刷新
    hotOnly: true
  },
  // HtmlWebpackPlugin会在打包结束后,自动生成一个html文件,并把打包生成的js自动引入到这个html文件中
  plugins: [
    new HtmlWebpackPlugin({
      template: 'src/index.html'
    }),
    new CleanWebpackPlugin(),
    // 当dev-server,两项host配置搞定后,再使用这个插件后,hmr功能就生效了
    new webpack.HotModuleReplacementPlugin()
  ],
}
这个时候再去更改样式,就不会影响之前js对html的变更。改了css文件,就只会替换css的内容
所以使用HMR的好处是,在写css的时候,方便调试css。
 
这是时候再把上面的配置恢复到没有hmr的时候
module.exports = {
  // 起个服务器
  devServer: {
    // 这个意思是服务器要生成在哪个文件夹下
    contentBase:'./dist',
    // 启动的时候自动打开浏览器,然后自动访问这个服务器地址
    open:true
  },
  // HtmlWebpackPlugin会在打包结束后,自动生成一个html文件,并把打包生成的js自动引入到这个html文件中
  plugins: [
    new HtmlWebpackPlugin({
      template: 'src/index.html'
    }),
    new CleanWebpackPlugin()
  ],
}
index.js
import counter from './counter';
import number from './number'; counter();
number();
counter.js
function counter() {
  var div = document.createElement('div');
  div.setAttribute('id', 'counter');
  div.innerHTML = 1;
  div.onclick = function() {
  div.innerHTML = parseInt(div.innerHTML, 10) + 1;
}
document.body.appendChild(div); export default counter;

number.js

function number() {
  var div = document.createElement('div');
  div.setAttribute('id', 'number');
  div.innerHTML = 1000;
  document.body.appendChild(div);
}
export default number;
这个时候运行页面,把1增加到10。这个时候将number.js里面写死的1000变成2000。发现,呀,我之前点击到的10,又重新恢复到了1。说明刷新了页面。之前的一些数据没有保存下来。我希望number的数据更新到,别去更新我counter.js到内容。这时候把配置加回来
module.exports = {
  // 起个服务器
  devServer: {
    // 这个意思是服务器要生成在哪个文件夹下
    contentBase:'./dist',
    // 启动的时候自动打开浏览器,然后自动访问这个服务器地址
    open:true,
    // 开启Hot Module Replacement
    hot: true,
    // 即便hmr的功能没有生效,浏览器也不要自动刷新
    hotOnly: true
  },
  // HtmlWebpackPlugin会在打包结束后,自动生成一个html文件,并把打包生成的js自动引入到这个html文件中
  plugins: [
    new HtmlWebpackPlugin({
      template: 'src/index.html'
    }),
    new CleanWebpackPlugin(),
    // 当dev-server,两项host配置搞定后,再使用这个插件后,hmr功能就生效了
    new webpack.HotModuleReplacementPlugin()
  ],
}

发现number代码改成2000,页面上的1000并没有变成2000。这个时候需要自己去加点代码

index.js
import counter from './counter';
import number from './number'; counter();
number(); if(module.hot) {
  module.hot.accept('./number', ()=>{
    let removeNode = document.getElementById('number');
    document.body.removeChild(removeNode);
    number();
  })
}
这个时候把1点到10。再去更改number里面的代码,把1000改成2000。这个时候发现10没有任何变化,只从1000更新到20000。
那么这个时候就会想css会自动更新,这里却要在index里面多加这层判断。其实css也是要加这层判断的,只是css-loader里面已经加了这段代码,所以不用写。react,vue里面也内置了这些代码。本质上要写hmr的内容,都需要写这段。只不过框架帮我们实现了,自己不用去写。

webpack中热模块更新的更多相关文章

  1. Webpack & The Hot Module Replacement热模块替换原理解析

    Webpack & The Hot Module Replacement热模块替换原理解析 The Hot Module Replacement(HMR)俗称热模块替换.主要用来当代码产生变化 ...

  2. Webpack中hash与chunkhash的区别,以及js与css的hash指纹解耦方案

    文件的hash指纹通常作为前端静态资源实现增量更新的方案之一,Webpack是目前最流行的开源编译工具之一,其强大的功能也带来很多坑(当然,大部分麻烦其实都可以在官方文档中找到答案). 比如,在Web ...

  3. webpack中如何使用vue

    1.安装 vue包:npm i vue -S 2.由于在webpack中,推荐使用.vue这个组件模版文件来定义组件,不然会出现vue.js移动和一些高级语法的不支持,因此需要安装能解析这种文件的lo ...

  4. webpack中配置Babel

    Babel是一个javascript编译器,可以将ES6和更新的js语法转换成ES5的,使代码在较老的浏览器里也能正常运行. 一.安装 npm install --save-dev babel-loa ...

  5. Webpack的详细配置,[Webpack中各种loader的安装配置]

    在使用webpack的时候,你是不是被以下这种报错所困扰: 注意看 黄色框中标注的 You may need an appropriate loader to handle this file typ ...

  6. webpack与browser-sync热更新原理深度讲解

    本文首发于CSDN网站,下面的版本又经过进一步的修订.原文:webpack与browser-sync热更新原理深度讲解本文包含如下内容: webpack-hot-middleware EventSou ...

  7. vue2.0基础知识,及webpack中vue的使用

    ## 基础指令 ## [v-cloak]{         Display:none;     }     <p v-cloak>xx{{msg}}xx</p> //解决闪烁问 ...

  8. vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete)

    vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete) 手把手式笔记 Axios配置 安装 axios ...

  9. 17 webpack中babel的配置

    在webpack中,默认只能处理一部分ES6的新语法,一些更高级的ES6语法或者ES7语法, webpack是处理不了的:这时候,就需要借助于第三方的loader,来帮助webpack处理这些高级的语 ...

随机推荐

  1. SqlServer常用语句

    首先,写这个的原因是我其实sql语句不太行,总觉得自己写得很乱,好像也没有系统学习过,借此复习和与大家探讨 No.1 关于查询时间区间是否重叠的sql语句 问题是这样:插入之前,想查询同User是否其 ...

  2. 程序员必备技能:代码审查 (Google牛人谈Code Review)

    在上一篇博客里我暗示自己将不在为Google工作. 我还没有决定好去哪儿-有几个非常不错的工作机会让我选择.鉴于这段时间内我不受雇于任何公司,我想我可以写点和专业相关的东西,这些东西很有趣,但是如果我 ...

  3. 设置placeholder的字体颜色

    //设置字体颜色 [self.searchTextField setValue:[UIColor colorWithRed:0.50 green:0.50 blue:0.50 alpha:1.0] f ...

  4. 阿里巴巴的数据池DRUID

      使用了阿里巴巴的数据池管理: 监控DB池连接和SQL的执行情况 https://github.com/alibaba/druid/wiki/常见问题 https://www.cnblogs.com ...

  5. Q:关于栈的常见问题

     对于栈,一个常见的问题是:给定一个序列a0,a1,a2,a3...an依次顺序入栈,在元素顺序入栈的过程中,栈中任意一个元素可以选择是否出栈,则其共有几种出栈的可能,给定的出栈序列中,哪种是不可能的 ...

  6. 微信小程序-scroll-view组件

    <view class="section"> <view class="section__title">vertical scroll& ...

  7. OkHttp3源码详解(三) 拦截器-RetryAndFollowUpInterceptor

    最大恢复追逐次数: ; 处理的业务: 实例化StreamAllocation,初始化一个Socket连接对象,获取到输入/输出流()基于Okio 开启循环,执行下一个调用链(拦截器),等待返回结果(R ...

  8. android头像上传(获取头像加剪切)

    因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下. demo我是类似仿微信的,在一个GridView中展示所有的图片,其中第一个item可以去照相:获取到图片后再进行剪切. 图片的剪切是 ...

  9. 本地调试接口返回信息不对 以及 jar冲突问题

    今天下午在本地调试的时候碰到个很奇怪的问题:服务调用接口,返回的明明是有数据的,然后通过gson转换对象后,对象里面并没有自己想要的数据.看了代码什么的都没有问题.思考到底是哪里出了问题,想了半天想到 ...

  10. 电话面试问答Top 50 --[伯乐在线]

    今年是2015年,在过去几年中,电面(电话面试)是筛选程序员职位候选人的最流行的方式.它让雇佣双方很容易互相了解对方,候选人不需要去未来雇主的所在地,面试官也不用做额外的安排.这是我介绍程序员面试问题 ...