webpack热更新原理 面试(webpack如何实现热模块替换)

2026-05-24 10:30:01 :0

webpack热更新原理 面试(webpack如何实现热模块替换)

本篇文章给大家谈谈webpack热更新原理 面试,以及webpack如何实现热模块替换对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

webpack如何实现热模块替换


这次给大家带来webpack如何实现热模块替换,webpack实现热模块替换的注意事项有哪些,下面就是实战案例,一起来看一下。
模块热替换(HMR)的作用是,在应用运行时,无需刷新页面,便能替换、增加、删除必要的模块。 HMR 对于那些由单一状态树构成的应用非常有用。因为这些应用的组件是 “dumb” (相对于 “smart”) 的,所以在组件的代码更改后,组件的状态依然能够正确反映应用的最新状态。
webpack-dev-server内置“live reload”,会自动刷新页面。
文件目录如下:
app
a.js
component.js
index.js
node_modules
package.json
webpack.config.js
component.js中导入了a.js。index.js导入了component.js。修改任意一个文件,都能达到热更新功能。
最重要的是,在index.js中,有这样一段代码:(完成热更新必须需要)
if(module.hot){
module.hot.accept(moduleId, callback);
}下面是package.json配置:
{
"name": "webpack-hmr",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon --watch webpack.config.js --exec \"webpack-dev-server --env development\"",
"build": "webpack --env production"
},
"keywords": ,
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^2.28.0",
"nodemon": "^1.11.0",
"webpack": "^2.2.1",
"webpack-dev-server": "^2.4.1"
}
}从依赖就可以看到,这真的是一个最简单的配置了。其中nodemon用来监听webpack.config.js文件的状态,只要发生改变,就重新执行命令。
***隐藏网址***
***隐藏网址***
接下来是webpack.config.js了,既然package.json的scripts中定义了两种命令,我们还是要在配置文件中实现两种情况(development和production,你也可以修改配置其中一种)。
const path = require(’path’);
const HtmlWebpackPlugin = require(’html-webpack-plugin’);
const webpack = require(’webpack’);
const PATHS = {
app: path.join(dirname, ’app’),
build: path.join(dirname, ’build’),
};
const commonConfig={
entry: {
app: PATHS.app + ’/index.js’,
},
output: {
path: PATHS.build,
filename: ’.js’,
},
watch: true,
plugins: [
new HtmlWebpackPlugin({
title: ’Webpack demo’,
}),
],
}
function developmentConfig(){
const config ={
devServer:{
historyApiFallback:true, //404s fallback to ./index.html
// hotOnly:true, 使用hotOnly和hot都可以
hot: true,
stats:’errors-only’, //只在发生错误时输出
// host:process.env.Host, 这里是undefined,参考的别人文章有这个
// port:process.env.PORT, 这里是undefined,参考的别人文章有这个
overlay:{ //当有编译错误或者警告的时候显示一个全屏overlay
errors:true,
warnings:true,
}
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // 更新组件时在控制台输出组件的路径而不是数字ID,用在开发模式
// new webpack.HashedModuleIdsPlugin(), // 用在生产模式
],
};
return Object.assign(
{},
commonConfig,
config,
{
plugins: commonConfig.plugins.concat(config.plugins),
}
);
}
module.exports = function(env){
console.log("env",env);
if(env==’development’){
return developmentConfig();
}
return commonConfig;
};关于Object.assign,第一个参数是目标对象,如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。浅赋值,对于对象的复制使用=,即引用复制。
env参数通过cli传入。
然后打开命令行到当前目录,运行npm start或者npm run build就好啦。注意,前者是在开发环境下,是没有输出文件的(在内存),只有运行后者才会有输出文件。
相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
mint-ui使用步骤详解
JS有哪些属性可以判断页面是否存在滚动条
常用的6大JS排序算法与比较

怎样对webpack模块进行热替换


这次给大家带来怎样对webpack模块进行热替换,对webpack模块进行热替换的注意事项有哪些,下面就是实战案例,一起来看一下。
全称是Hot Module ReplaceMent(HMR),理解成热模块替换或者模块热替换都可以吧,和.net中的热插拔一个意思,就是在运行中对程序的模块进行更新。这个功能主要是用于开发过程中,对生产环境没有任何帮助(这一点区别.net热插拔)。效果上就是界面的无刷新更新。
HMR基于WDS,style-loader可以通过它来实现无刷新更新样式。但是对于JavaScript模块就需要做一点额外的处理,怎么处理继续往下看。因为HMR是用于开发环境的,所以我们修改下配置,做两份准备。一个用于生产,一个用于开发。
const path = require(’path’);
const HtmlWebpackPlugin = require(’html-webpack-plugin’);
const webpack = require(’webpack’);
const PATHS = {
app: path.join(dirname, ’app’),
build: path.join(dirname, ’build’),
};
const commonConfig={
entry: {
app: PATHS.app,
},
output: {
path: PATHS.build,
filename: ’.js’,
},
plugins: [
new HtmlWebpackPlugin({
title: ’Webpack demo’,
}),
],
}

function developmentConfig(){
const config ={
devServer:{
//使能历史记录api
historyApiFallback:true,
hotOnly:true,//关闭热替换 注释掉这行就行
stats:’errors-only’,
host:process.env.Host,
port:process.env.PORT,
overlay:{
errors:true,
warnings:true,
}
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
],
};
return Object.assign(
{},
commonConfig,
config,
{
plugins: commonConfig.plugins.concat(config.plugins),
}
);
}
module.exports = function(env){
console.log("env",env);
if(env==’development’){
return developmentConfig();
}
return commonConfig;
};这个webpack.config.js建立了两个配置,一个是commonConfig,一个是developmentConfig 两者通过env参数来区分,但这个env参数是怎么来的呢?我们看看之前的package.json中的一段:
也就是说,如果按照上面的这个配置,我们通过npm start 启动的话,进入的就是开发环境配置,如果是直接build,那么就是生产环境的方式。build方式是第一节里面讲的 直接通过npm启动webpack,这就不带WDS了。另外有了一个Object.assign语法,将配置合并。这个时候通过npm start启动,控制台打印出了两条日志。
看起来HRM已经启动了。但是此时更新一下component.js
日志显示没有东西被热更新。而且这个39,36代表的是模块Id,看起来很不直观,这里可以通过一个插件使其更符合人意
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
],这个时候再启动。
这样名称就直观了。但是我们期待的更新还是没有出来。因为需要实现一个接口
import component from ’./component’;
let demoComponent=component();
document.body.appendChild(demoComponent);
//HMR 接口
if(module.hot){
module.hot.accept(’./component’,()=》{
const nextComponent=component();
document.body.replaceChild(nextComponent,demoComponent);
demoComponent=nextComponent;
})
}并修改component.js:
export default function () {
var element = document.createElement(’h1’);
element.innerHTML = ’Hello webpack’;
return element;
}
这个时候页面更新了。每次改动页面上都会增加一个带有hot-update.js ,类似于下面这样:
webpackHotUpdate(0,{
/***/ "./app/component.js":
/***/ (function(module, webpack_exports, webpack_require) {
"use strict";
Object.defineProperty(webpack_exports, "esModule", { value: true });
/* harmony default export */ webpack_exports = function () {
var element = document.createElement(’h1’);
element.innerHTML = ’Hello web ’;
element.className=’box’;
return element;
};
/***/ })
})通过webpackHotUpdate对相应模块进行更新。0表示模块的id,"./app/component.js"表示模块对应的name。结构是webpack(id,{key:function(){}})。function外带了一个括号,不知道有什么作用。webpackHotUpdate的定义是这样的:
this =
function webpackHotUpdateCallback(chunkId, moreModules) { // eslint-disable-line no-unused-vars
hotAddUpdateChunk(chunkId, moreModules);
if(parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
} ;小结:从结构来看,一个是id,一个是对应修改的模块。但实际执行更新的是hotApply方法。热更新整个机制还是有点复杂,效果上像MVVM的那种绑定。有兴趣的可以深入研究下。不建议在生产使用HMR,会让整体文件变大,而且对生成没有什么帮助,在下一节会讲样式的加载,style-loader就是用到了HMR。但对于js模块还要写额外的代码,这让人有点不爽。
相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
怎样搭建vue2.0+boostrap项目
如何用vue设置proxyTable参数跨域
Angular入口组件与声明式组件案例对比

面试被问webpack分包问题,怎么答[捂脸]=

如实回答,如果没准备好可以第二次再来面试。
Webpack是一个模块打包器,主要目的是在浏览器上打包JavaScript文件。捆绑ES模块、CommonJS和AMD模块(以及绑定)。可以创建在运行时异步加载的单个捆绑包或多个块(以减少初始加载时间)。
在编译过程中解决了依赖性,从而减小了运行时大小。加载程序可以在编译时对文件进行预处理,例如,将TypeScript转换为JavaScript、将Handlebars字符串转换为已编译函数、将图像转换为Base64,等等。高度模块化的插件系统可以执行您的应用程序所需的其他任何操作。

ik分词器热更新原理

原理如下。
1.第一步,在 webpack 的 watch 模式下,文件系统中某一个文件发生修改,webpack 监听到文件变化,根据配置文件对模块重新编译打包,并将打包后的代码通过简单的 JavaScript 对象保存在内存中。
2.第二步是 webpack-dev-server 和 webpack 之间的接口交互,而在这一步,主要是 dev-server 的中间件 webpack-dev-middleware 和 webpack 之间的交互,webpack-dev-middleware 调用 webpack 暴露的 API对代码变化进行监控,并且告诉 webpack,将代码打包到内存中。
3.第三步是 webpack-dev-server 对文件变化的一个监控,这一步不同于第一步,并不是监控代码变化重新打包。当我们在配置文件中配置了devServer.watchContentBase 为 true 的时候,Server 会监听这些配置文件夹中静态文件的变化,变化后会通知浏览器端对应用进行 live reload。注意,这儿是浏览器刷新,和 HMR 是两个概念。
4.第四步也是 webpack-dev-server 代码的工作,该步骤主要是通过 sockjs(webpack-dev-server 的依赖)在浏览器端和服务端之间建立一个 websocket 长连接,将 webpack 编译打包的各个阶段的状态信息告知浏览器端,同时也包括第三步中 Server 监听静态文件变化的信息。浏览器端根据这些 socket 消息进行不同的操作。当然服务端传递的最主要信息还是新模块的 hash 值,后面的步骤根据这一 hash 值来进行模块热替换。
5.webpack-dev-server/client 端并不能够请求更新的代码,也不会执行热更模块操作,而把这些工作又交回给了 webpack,webpack/hot/dev-server 的工作就是根据 webpack-dev-server/client 传给它的信息以及 dev-server 的配置决定是刷新浏览器呢还是进行模块热更新。当然如果仅仅是刷新浏览器,也就没有后面那些步骤了。
6.HotModuleReplacement.runtime 是客户端 HMR 的中枢,它接收到上一步传递给他的新模块的 hash 值,它通过 JsonpMainTemplate.runtime 向 server 端发送 Ajax 请求,服务端返回一个 json,该 json 包含了所有要更新的模块的 hash 值,获取到更新列表后,该模块再次通过 jsonp 请求,获取到最新的模块代码。这就是上图中 7、8、9 步骤。
7.而第 10 步是决定 HMR 成功与否的关键步骤,在该步骤中,HotModulePlugin 将会对新旧模块进行对比,决定是否更新模块,在决定更新模块后,检查模块之间的依赖关系,更新模块的同时更新模块间的依赖引用。
8.最后一步,当 HMR 失败后,回退到 live reload 操作,也就是进行浏览器刷新来获取最新打包代码。

webpack如何实现热模块替换的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于webpack如何实现热模块替换、webpack如何实现热模块替换的信息别忘了在本站进行查找哦。

webpack热更新原理 面试(webpack如何实现热模块替换)

本文编辑:admin

更多文章:


mvc模型功能(什么是mvc模式)

mvc模型功能(什么是mvc模式)

今天给各位分享什么是mvc模式的知识,其中也会对什么是mvc模式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录什么是mvc模式什么是 mvc 模式mvc 模式的好处是什么MVC模式各个层的具体作用mvc是什么

2025年9月23日 21:15

jquery sortable(jquery sortable怎么支持多个一起拖拽)

jquery sortable(jquery sortable怎么支持多个一起拖拽)

各位老铁们好,相信很多人对jquery sortable都不是特别的了解,因此呢,今天就来为大家分享下关于jquery sortable以及jquery sortable怎么支持多个一起拖拽的问题知识,还望可以帮助大家,解决大家的一些困惑,

2026年8月28日 14:00

数组大小计算公式(关于EXCEL里数组比较大小 然后分别赋值的公式)

数组大小计算公式(关于EXCEL里数组比较大小 然后分别赋值的公式)

大家好,关于数组大小计算公式很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于关于EXCEL里数组比较大小 然后分别赋值的公式的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各

2025年6月18日 08:30

addeventlistener()(window.addeventlistener怎么用)

addeventlistener()(window.addeventlistener怎么用)

各位老铁们,大家好,今天由我来为大家分享addeventlistener(),以及window.addeventlistener怎么用的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢

2026年5月21日 20:00

display在java中什么意思(javascript中 visibility和display的区别)

display在java中什么意思(javascript中 visibility和display的区别)

今天给各位分享javascript中 visibility和display的区别的知识,其中也会对javascript中 visibility和display的区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目

2025年10月10日 06:30

南通网站建设制作(南通七二网络科技有限公司怎么样)

南通网站建设制作(南通七二网络科技有限公司怎么样)

这篇文章给大家聊聊关于南通网站建设制作,以及南通七二网络科技有限公司怎么样对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录南通七二网络科技有限公司怎么样南通中汇网络科技有限公司怎么样南通网站建设便宜又好南通米兔网络科技有限公司

2026年4月10日 02:00

web of science怎么看全文(如何在web of science 上检索一个学者的全部文章)

web of science怎么看全文(如何在web of science 上检索一个学者的全部文章)

其实web of science怎么看全文的问题并不复杂,但是又很多的朋友都不太了解如何在web of science 上检索一个学者的全部文章,因此呢,今天小编就来为大家分享web of science怎么看全文的一些知识,希望可以帮助到

2025年12月22日 01:15

vase是什么意思?vase怎么读

vase是什么意思?vase怎么读

各位老铁们,大家好,今天由我来为大家分享vases,以及vase是什么意思的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录vase是什么意思vase

2026年2月2日 17:30

oracle语句去除重复值语句(oracle去除重复数据)

oracle语句去除重复值语句(oracle去除重复数据)

其实oracle语句去除重复值语句的问题并不复杂,但是又很多的朋友都不太了解oracle去除重复数据,因此呢,今天小编就来为大家分享oracle语句去除重复值语句的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录o

2025年11月24日 09:45

soil的翻译(英语单选提问:soil 与earth 的区别)

soil的翻译(英语单选提问:soil 与earth 的区别)

这篇文章给大家聊聊关于soil的翻译,以及英语单选提问:soil 与earth 的区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录英语单选提问:soil 与earth 的区别soil的音标soil的近义词earth lan

2026年1月16日 17:15

8086汇编语言中的DIV指令溢出问题(回答的好会加分)?汇编里面,进位一定溢出吗

8086汇编语言中的DIV指令溢出问题(回答的好会加分)?汇编里面,进位一定溢出吗

本篇文章给大家谈谈汇编溢出,以及8086汇编语言中的DIV指令溢出问题(回答的好会加分)对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录8086汇编语言中的DIV指令溢出问题(回答的好会加分)汇编里面,进位一定溢出吗汇编除法溢

2026年2月5日 09:15

server有什么用(sasserver有什么用)

server有什么用(sasserver有什么用)

“server有什么用”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看server有什么用(sasserver有什么用)!本文目录sasserver有什么用微软的server软件是做什么用的为什么要用虚拟机装windowss

2025年11月7日 15:45

简单的网站页面(简单网页设计模板-ps怎么设计网页模板)

简单的网站页面(简单网页设计模板-ps怎么设计网页模板)

今天给各位分享简单网页设计模板-ps怎么设计网页模板的知识,其中也会对简单网页设计模板-ps怎么设计网页模板进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录简单网页设计模板-ps怎么设计网页模板简约网页怎么制作

2025年10月20日 03:00

markers(markers中文是什么意思)

markers(markers中文是什么意思)

大家好,markers相信很多的网友都不是很明白,包括markers中文是什么意思也是一样,不过没有关系,接下来就来为大家分享关于markers和markers中文是什么意思的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧

2025年7月2日 04:00

readfile共享读写(MFC如何读取文件到内存,再写到磁盘)

readfile共享读写(MFC如何读取文件到内存,再写到磁盘)

本篇文章给大家谈谈readfile共享读写,以及MFC如何读取文件到内存,再写到磁盘对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录MFC如何读取文件到内存,再写到磁盘ReadFile同步读取磁盘数据,如何设置超时window

2026年6月6日 02:45

datetime库的time引用(python中如何把datetime.datetime转换成datetime.time)

datetime库的time引用(python中如何把datetime.datetime转换成datetime.time)

大家好,关于datetime库的time引用很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于python中如何把datetime.datetime转换成datetime.time的知识点,相信应该可以解决大家的一些困惑和问题

2025年10月5日 10:45

匿名内部类是什么意思(内部类和匿名内部类的用法)

匿名内部类是什么意思(内部类和匿名内部类的用法)

大家好,匿名内部类是什么意思相信很多的网友都不是很明白,包括内部类和匿名内部类的用法也是一样,不过没有关系,接下来就来为大家分享关于匿名内部类是什么意思和内部类和匿名内部类的用法的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开

2026年5月5日 18:45

asp代码加密 解密?ae能导入asp文件吗

asp代码加密 解密?ae能导入asp文件吗

大家好,如果您还对aspae不太了解,没有关系,今天就由本站为大家分享aspae的知识,包括asp代码加密 解密的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录asp代码加密 解密ae能导入asp文件吗asp代码加

2025年10月16日 21:00

long int类型占几个字节(【C语言】关于int、long所占字节数问题的讨论万分感谢!)

long int类型占几个字节(【C语言】关于int、long所占字节数问题的讨论万分感谢!)

本篇文章给大家谈谈long int类型占几个字节,以及【C语言】关于int、long所占字节数问题的讨论万分感谢!对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录【C语言】关于int、long所占字节数问题的讨论万分感谢!C语

2025年11月24日 21:00

百度安全中心下载(windows安全中心怎么下载)

百度安全中心下载(windows安全中心怎么下载)

各位老铁们,大家好,今天由我来为大家分享百度安全中心下载,以及windows安全中心怎么下载的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录wind

2025年7月17日 14:30

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索