使用webpack有一段时间了,其中的模块热加载加快了开发的速度。它无需刷新,只要修改了文件,客户端就立刻立刻做热加载。如何做到?当然理解他的最好的做法就是我们自己做做一遍。

本文关心的是:

  1. dev-middleware内部

  2. HMR(webpack-hot-middleware)的利用

这次提供热加载的代码共两个文件(放置于src内),a依赖于b,并调用b的引出函数:

// a.js
var b = require("./b.js")
b.b()// b.js
exports.b = function b(){console.log("h")
}

首先我需要使用dev-middleware让使用require函数成为可能,其次我希望使用HMR,当b文件内修改时,可以自动热加载,而不是必须完整reload才可以。当然,按照webpack的管理,我们需要一个入口index.html,放置于output内:

<html><body><script type="text/javascript" src="bundle.js"></script></body>
</html>

希望热加载的代码就是这样了。目录结构如下:


├── output
│   ├── bundle.js
│   └── index.html
├── package.json
├── server.js
└── src├── a.js└── b.js

其中的server.js在随后创建。现在我们创建环境,让它可以热加载:
创建目录环境的命令为:

mkdir src
touch src/a.js
touch src/b.js
mkdir output
touch output/index.html
touch server.js

创建环境

npm init -y
npm install express --save
npm install webpack webpack-dev-middleware webpack-hot-middleware --save-dev

创建服务器文件

此服务器文件使用express创建服务器监听,使用dev中间件,HMR中间件:

var express = require('express')
var webpack = require('webpack')
var path = require('path')
var app = express()
var webpackMiddleware = require("webpack-dev-middleware");
var compiler = webpack({entry: ["./src/a.js",'webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000',],output: {path: path.resolve(__dirname, './output/'),filename:'bundle.js',},plugins: [new webpack.optimize.OccurenceOrderPlugin(),new webpack.HotModuleReplacementPlugin(),new webpack.NoErrorsPlugin()]
})
var options ={publicPath: "/",
}
app.use(webpackMiddleware(compiler, options));
app.use(require("webpack-hot-middleware")(compiler));
app.use(express.static('output'))
app.listen(8080, function () {console.log('Example app listening on!')
})

其中dev中间件中涉及到的入口文件的做法和一般的webpack做法一样,但是多出一个webpack-hot-middleware/client文件,此文件用来传递到客户端,并和服务器的HMR插件联络,联络的URL为path=/__webpack_hmr&timeout=20000,其中path有HMR服务监听,timeout则可以望文生义,知道失联的话,达到20000毫秒就算超时,不必再做尝试。

为了让HMR知道a、b文件是可以热加载的,必须在入口文件内(也就是a.js)内的尾部加入代码:

if (module.hot) {module.hot.accept();
}

也就是说a.js得修改为:

// a.js
var b = require("./b.js")
b.b()if (module.hot) {module.hot.accept();
}

现在执行服务:

node server.js

打开浏览器,访问localhost:8080 ,并打开Chrome devtools,看到


bundle.js:1916 h
bundle.js:1626 [HMR] connected

现在修改b.js内的字符串为hello HMR,看到Console输出:


Hello HMR
bundle.js:1847 [HMR] Updated modules:
bundle.js:1849 [HMR]  - ./src/b.js
bundle.js:1849 [HMR]  - ./src/a.js
bundle.js:1854 [HMR] App is up to date.

就是说HMR已经激活。

ref : https://github.com/ahfarmer/w...

webpack 热加载你站住,我对你好奇很久了相关推荐

  1. webpack 热加载原理探索

    前言 在使用 dora 作为本地 server 开发一个 React 组件的时候,默认使用了 hmr 插件.每次修改代码后页面直接更新,不需要手动 F5 ,感觉非常惊艳,这体验一旦用上后再也回不去了. ...

  2. 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件的解决方法(webpack热加载)

    [README]webpack-dev-server 是一个支持热编译的服务器(动态编译) [1]问题 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件的 ...

  3. vue indev.html,webpack多入口热加载很慢

    项目是多入口(多页面),每次修改代码,热加载都很慢,定格在 94% asset optimization持续5秒左右,页面才更新内容.这个应该是webpack存在的问题. 我发现减少页面数量,热加载会 ...

  4. webpack:多文件、多环境、跨域处理、热加载

    文章目录 webpack:多文件.多环境.跨域处理.热加载 多页面处理 webpack多环境 vuecli多环境配置 配置不同的打包命令 定义变量 跨域 通过node模拟接口 通过webpack解决跨 ...

  5. webpack Vue热加载配置好的确不行解决方法,限于webstorm编辑

    webpack Vue热加载配置好的确不行解决方法,限于webstorm编辑 最后Use"safe write.....啥的对号去掉

  6. webpack3+node+react+babel实现热加载(hmr)

    前端工程化开发的一个重要标志就是热替换技术,它大大的提高开发效率,使我们专注于写代码,webpack3中的热替换相比较1更加简洁. 1. 先看效果 Demo地址 https://github.com/ ...

  7. 手把手教你webpack3(14)HMR模块热加载

    前注: 文档全文请查看 根目录的文档说明. 如果可以,请给本项目加[Star]和[Fork]持续关注. 有疑义请点击这里,发[Issues]. 点击这里查看DEMO 7.模块热加载 HMR 7.0.使 ...

  8. vuecli开发时HMR热加载暂时失效的一种解决方法

    情形: WDS的HMR启动正常但是无法实现热加载功能 开发中因为碰到如下问题 VUE报错代码:SOCKJS.JS?9BE2:1606 GET HTTP://192.168.1.101:8080/SOC ...

  9. 热加载和热部署,没听过?看看 Tomcat 是怎么实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 不学无数的程序员 来源 | https://urlify ...

最新文章

  1. 一起谈.NET技术,ASP.NET Eval如何进行数据绑定
  2. python主要用于什么-python主要用于哪些方向
  3. php恒等符,php学习笔记(三)操作符与控制结构
  4. web服务器之iis,apache,tomcat三者之间的比较
  5. 怎样通过vb设置透视表多项选择_四个操作带你玩转数据透视表,秒杀Excel函数,提升你的工作效率...
  6. 简述 HTTPS 证书认证
  7. c语言小游戏百度云资源,c语言小游戏合集
  8. Smart3D基础理论
  9. H5 活动利用Canvas把用户信息和二维码合并到图片内。
  10. 信捷PLC远程上下载程序,远程控制
  11. 20135202闫佳歆-期中总结
  12. 键 -- 主键、候选键、可选键
  13. 爬虫技术:scrapy 知识点一
  14. tomcat源码解读(一)
  15. 微火上线ai绘画小程序搭建系统,ai绘画小程序源码触手可及
  16. 【贪心】兔警官朱迪买礼物
  17. 硬件设计—数字电路常用设计准则
  18. 计算机基础——硬盘篇
  19. 逻辑漏洞之越权、支付漏洞
  20. ADT OO OB 的区别

热门文章

  1. NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别
  2. SPH算法(求最小代价树)
  3. 详解Javascript中的Array对象
  4. html5游戏制作总结
  5. 编译cubieboard android 源码过程详解之(六):pack
  6. shell如何自动输入密码
  7. 利用DotRAS组件,实现ADSL的自动拨号断网自动化操作[转]
  8. 诗与远方:无题(三十)- 凄凉缘空
  9. Log4j2日志框架集成Slf4j日志门面
  10. anaconda安装keras_关于yolo模型的试安装及关于现阶段安排的一点想法