webpack 热加载你站住,我对你好奇很久了

极客班主任
• 阅读 6178

使用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...

点赞
收藏
评论区
推荐文章
Karen110 Karen110
4年前
【前端自动化】如何使用Node.js实现热重载页面
前言前不久我结合browsersyncgulpgulpnodemon实现了一款生产环境热更新(我之前理解有点偏差,应该定义为热更新,不是热重载)的项目脚手架,那么,今天我们将使用Node.js实现一个热重载页面。那么,我今天就总结一下吧,以防止大家也跟我一样。热重载所谓热重载就是页面每次改动,不需要手动去刷新,可自动刷新。热更新浏览器的无刷新更新,允许在
Jacquelyn38 Jacquelyn38
4年前
Vue3.0系列——「vue3.0学习手册」第一期
Vue3.0一、项目搭建vite是尤大大开发的一款意图取代webpack的工具。其实现原理是利用ES6的import发送请求加载文件的特性。拦截这些请求,做一些编译,省去webpack冗长的打包时间。并将其与Rollup捆绑在一起用于生产。在开发过程中没有捆绑。源代码中的ESImport语法直接提供给浏览器,浏览器通过本机<scriptmodule支持对
佛系码 佛系码
4年前
Webpack 热更新以及原理
什么是热更新模块热替换(hotmodulereplacement或HMR)是webpack提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新一般的刷新我们分两种:一种是页面刷新,不保留页面状态,就是简单粗暴,直接window.location.reload()。另一种是基于WDS(Webpackde
可莉 可莉
3年前
20k以上面试必问,Webpack原理和优化
我身边很多朋友都觉得Webpack不重要,认为只要团队里有人会就可以,而那个人不需要是自己。那么我就给你一个必须学它的理由:Webpack原理和优化工资20k以上的面试必问如果你想拿到高薪,Webpack就是你绕不过去的一道门槛。而即便不提面试,对于每一个前端工程师来说
Easter79 Easter79
3年前
TypeScript 文件引入 Html (ts import html webpack)
我们的目标是把html引入ts文件,webpack打包时就能把html打进js文件,减少文件加载啦1安装textloadernpminstalltextloadersavedev2webpack配置里新增textloader为文本加载器module:{rules:
Wesley13 Wesley13
3年前
KO
KOKO是一个基于Webpack开发的快速开始Web开发的脚手架工具,具有以下特性:可以当做一个Webpack配置种子来使用,无需二次配置、开箱即用自动支持多页应用(可选)Vue单文件组件的开发方式资源分块加载,内联和异步加载方式管理,低成本实现首屏优化支
Stella981 Stella981
3年前
Eclipse Spring Boot实现热部署
spring为开发者提供了一个名为springbootdevtools的模块来使SpringBoot应用支持热部署,提高开发者的开发效率,无需手动重启SpringBoot应用。devtools的原理深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更
Stella981 Stella981
3年前
JVM核心知识体系(转)
1.问题1、如何理解类文件结构布局?2、如何应用类加载器的工作原理进行将应用辗转腾挪?3、热部署与热替换有何区别,如何隔离类冲突?4、JVM如何管理内存,有何内存淘汰机制?5、JVM执行引擎的工作机制是什么?6、JVM调优应该遵循什么原则
Stella981 Stella981
3年前
Javascript模块化编程(二):AMD规范
七、模块的规范先想一想,为什么模块很重要?因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了。目前,通行的Javascript模块规范共
Easter79 Easter79
3年前
The way of Webpack learning (VI.)
使用commonChunkPlugin的都是基于webpack3.10.0,在webpack4中直接配置optimization就可以了。一:什么是长缓存?浏览器在用户访问页面的时候,为了加快加载速度,对用户请求的静态资源都会进行存储,但是每次代码更新或者升级的时候,我们都需要浏览器去加载新的代码。最方便的方法就是引入新的文件名称,只下载新的
Stella981 Stella981
3年前
Javascript模块化编程(二):AMD规范
七、模块的规范先想一想,为什么模块很重要?因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了。目前,通行的Javascript模块规范共有两种: