博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webpack 热加载你站住,我对你好奇很久了
阅读量:7211 次
发布时间:2019-06-29

本文共 2349 字,大约阅读时间需要 7 分钟。

使用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内:

        

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

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

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

创建目录环境的命令为:

mkdir srctouch src/a.jstouch src/b.jsmkdir outputtouch output/index.htmltouch server.js

创建环境

npm init -ynpm install express --savenpm 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 hbundle.js:1626 [HMR] connected

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

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

就是说HMR已经激活。

ref :

转载地址:http://pbgum.baihongyu.com/

你可能感兴趣的文章
BATCH、事务、CLOB、BLOB
查看>>
Android根据分辨率进行单位转换-(dp,sp转像素px)
查看>>
ADO中GetCollect()函数获取EXCEL表格中完整数字的方法
查看>>
Adaboost 算法
查看>>
UML类图几种关系总结
查看>>
算法中的几个标记记号(big-oh, theta, omega)
查看>>
Nginx 对访问量的控制
查看>>
重载小于号
查看>>
CentOS6.4编译Hadoop-2.4.0
查看>>
智能家居产业发展迅速助力生活品质提升
查看>>
批处理-For详解
查看>>
node.js从入门到菜鸟——资源无法载入?你需要学会地址解析
查看>>
SolrCore Initialization Failures - Max direct memory is likely too low
查看>>
jnlp jws
查看>>
使用md5的密码加密,处理用户的密码
查看>>
2019年规划
查看>>
drag drop小游戏
查看>>
Struts2_day02--Struts2封装获取表单数据方式
查看>>
JBPM4.4_执行流程实例
查看>>
RAC配置笔记
查看>>