Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >配置多入口 Webpack 热更新失效?

配置多入口 Webpack 热更新失效?

原创
作者头像
发声的沉默者
修改于 2021-06-16 02:04:42
修改于 2021-06-16 02:04:42
2.1K0
举报
文章被收录于专栏:江歌闲谈江歌闲谈

前言

Webpack 对于现代前端开发者,想必是相当熟悉了,在很多项目中,应用非常广泛,而 webpack-dev-server,相信大家应该也都接触过。最近,作者在配置多入口,热更新在单入口是好使的,结果到了多入口不好使?,然后通过 Google 寻找答案,找到了一篇 issueHMR not working with multiple entries,跟我的问题类似,好像真的有 BUG?看到作者回复

WechatIMG1679
WechatIMG1679

v4 修复了该问题,我丢,我还在使用 v3,翻看 v4 文档

WechatIMG1680
WechatIMG1680

此时,只有一个感觉,热更新都多久的东西了,不应该存在多入口,热更新有问题吧?升级到 v4 之后,还是不行,当时我这暴脾气就上来了,直接翻看源码。翻看源码之前,首先要对热更新是个什么,有个基础的了解。

模块热更新

模块热更新(Hot Module Replacement)是指在浏览器运行过程中,替换、添加或删除模块,而无需重新加载整个页面。

  • 保留在完全重新加载页面期间丢失的应用程序状态
  • 在源代码中对 CSS/JS 进行修改,会立刻在浏览器中进行更新,并只更新改变的内容,节省开发时间

对比 Live Reload 方案,HMR 体现了其强大之处,实时模块热刷新和保存应用状态,极大的提高了开发效率和开发体验。

启用模块热更新

HMR 的启用十分简单,一个带有热更新功能的 webpack.config.js 文件的配置如下:

代码语言:txt
AI代码解释
复制
const path = require('path');

module.exports = {
    // ...
    entry: {
        app: ['./src/index.js']
    },
    devServer: {
        contentBase: path.resolve(__dirname, 'dist'),
        hot: true,
        historyApiFallback: true,
        compress: true
    }
};

src/index.js

代码语言:txt
AI代码解释
复制
if (module.hot) {
    module.hot.accept();
}

原理

网上关于 Webpack 热更新原理文章很多,这里就不详细描述了,推荐几个。

调试

npm link

代码语言:txt
AI代码解释
复制
$ git clone https://github.com/webpack/webpack-dev-server.git

一定要找到你项目中对应的版本包,对号入座噢,否则会报错,把 webpack-dev-server 项目拉下来之后,尝试在 webpack-dev-server/lib/Server.js 该文件增加一行 console.log

carbon
carbon

然后进入根目录

代码语言:txt
AI代码解释
复制
$ cd webpack-dev-server
$ npm link

生成软链

代码语言:txt
AI代码解释
复制
cd 项目地址
npm link webpack-dev-server

link 成功之后,会提示下面,更换了 webpack-dev-server 地址

代码语言:txt
AI代码解释
复制
jiang@JiangdeMacBook-Pro-3 commonVideoClient % cnpm link webpack-dev-server
/Users/jiang/Desktop/commonVideoClient/node_modules/webpack-dev-server -> /usr/local/lib/node_modules/webpack-dev-server -> /Users/jiang/Desktop/webpack-dev-server

然后在项目跑 webpack-dev-server,在控制台应该就会看到对应的输出了,调试源码非常方便。

npm link 方案,第三方库和项目属于不同的项目,它们有自己的 node_modules,如果第三方库和项目都使用了同一个依赖,它们会在各自的 node_modules 去查

找,如果这个依赖不支持多例,应用就会异常。

yalc

在开发和创作多个包(私有或公共)时,您经常发现自己需要在本地环境中正在处理的其他项目中使用最新/WIP 版本,而无需将这些包发布到远程注册中心。NPM 和 Yarn 使用类似的符号链接包( npm/yarn link)方法解决了这个问题。虽然这在许多情况下可能有效,但它经常带来令人讨厌的约束和依赖解析、文件系统之间的符号链接互操作性等问题。

yalc
yalc

全局安装 yalc

代码语言:txt
AI代码解释
复制
npm install -g yalc

生成 yalc 包

代码语言:txt
AI代码解释
复制
$ cd webpack-dev-server
$ yalc publish

可以在自己本地 /Users/jiang/.yalc/packages/webpack-dev-server,找到对应的包

代码语言:txt
AI代码解释
复制
cd 项目地址
yalc link webpack-dev-server

link 后,可以在自己项目下,找到 .yalc

每次手动修改第三方库的代码,都需要手动 link,就很麻烦,对不对?ok,神器来了,nodemon

代码语言:txt
AI代码解释
复制
npm install -g nodemon

nodemon
--ignore dist/
--ignore node_modules/
--watch lib # 观察目录
-C # 只在变更后执行,首次启动不执行命令
-e js,ts,html,less,scss 监控指定后缀名的文件
--debug # 调试
-x "yalc publish" 自定义命令

然后,我们来试试这个工具,在 webpack-dev-server,新增三行可执行命令

carbon2
carbon2

运行下 npm run watch,然后每次修改,都会自动更新,是不是很舒服?

<img width="119" alt="WeChat7c8e2813667093e82dc47a836e6d5cdb" src="https://user-images.githubusercontent.com/16217324/120896810-b1a78e00-c655-11eb-8c4f-3a4101336d7d.png">

网页调试

WechatIMG1776
WechatIMG1776

找到对应的文件位置和代码行数,通过浏览器进行断点调试,这个就不展开讲了。

找到问题

经过一番折腾,升级 webpack-dev-server@v4,原理分析,源码调试,与之前正常的单页应用进行对比,发现都是正常的,还是不行,我就郁闷了,为何呢?突然之间,我悟了,好像多页应用没有在入口进行 module.hot

之前在 app.jsx 中写的 module.hot

carbon3
carbon3

改在入口文件 进行 module.hot

carbon4
carbon4

ok,成功,喜大普奔。

WechatIMG1780
WechatIMG1780

总结

带着问题,阅读源码是最高效的,这样你在阅读源码的过程中也不会感到无聊,因为你是要解决问题,才会去看源码,对于不懂的代码,一点一点调试,一步一步走下去,再结合现有的一些原理文章(站在巨人的肩膀上)就会找到答案。这次的经历,也算很有意思,感谢小伙伴们的阅读,喜欢的可以点个赞噢 ? ~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
webpack热更新原理(面试大概率会问)
这里说明一下,webpack4和webpack5的配置信息或者显示信息可能有点区别
gogo2027
2022/10/10
1K0
简单了解webpack热更新原理
webpack热更新Hot Module Replacement应该所有人都知道,现象就是你修改代码保存之后,浏览器不会刷新,只会修改你更改过的依赖代码。我们平时用webpack-dev-server如果没有配置,是直接刷新浏览器,并不是热更新。
wade
2020/08/28
6950
轻松理解webpack热更新原理
HMR作为一个Webpack内置的功能,可以通过HotModuleReplacementPlugin或--hot开启。那么,HMR到底是怎么实现热更新的呢?下面让我们来了解一下吧!
Nealyang
2019/12/10
2.8K0
轻松理解webpack热更新原理
入门webpack的最佳实践(基于webpack4.X 5.X)--基础篇
来到这家公司之后,一直在使用webpack,也写了不少笔记,但是都比较零散,现在决定整理一下webpack相关的知识点,由浅入深,方便自己后续查漏补缺,后续会一直更新。
Jou
2022/09/28
4370
webpack4实用配置指南-上手篇
算起来已经有3到4个项目的webpack构建打包经历。然而每次搭建起来还是有新手既视感,比较捉急。工具用法的东西,好记性不如烂笔头,有必要系统梳理下webpack的配置常用配置以及构建优化。
elson
2018/06/19
4.8K0
Webpack 实战入门系列(二):插件使用及热更新打包
今天带来webpack入门系列第二篇,如果对webpack还不熟悉的可以先看入门第一篇一小时入门webpack。本文重点是插件用法及热更新打包,会涉及三个知识点,都是比较基础重要的内容。包括:插件用法(HtmlWebpackPlugin)、文件监听、热更新打包。教程相关代码已经上传到github(文末有地址),有需要可以下载。最好按步骤自己来,代码仅供参考。
一只图雀
2020/04/07
4940
webpack热更新配置小结
本文作者:IMWeb moonye 原文出处:IMWeb社区 未经同意,禁止转载 webpack热更新配置 热更新,可以使开发的人在修改代码后,不用刷新浏览器即可以看到修改后的效果。而它的另
IMWeb前端团队
2018/01/08
1.6K0
彻底搞懂并实现 webpack 热更新原理
HMR即Hot Module Replacement是指当你对代码修改并保存后,webpack将会对代码进行重新打包,并将改动的模块发送到浏览器端,浏览器用新的模块替换掉旧的模块,去实现局部更新页面而非整体刷新页面。接下来将从使用到实现一版简易功能带领大家深入浅出HMR。
五月君
2021/11/10
2.9K0
彻底搞懂并实现 webpack 热更新原理
【webpack 进阶】聊聊 webpack 热更新以及原理
模块热替换 (hot module replacement 或 HMR) 是 webpack 提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新
GopalFeng
2022/08/01
1.1K0
【webpack 进阶】聊聊 webpack 热更新以及原理
Webpack 如何配置热更新
是指 Hot Module Replacement,缩写为 HMR。对于你需要更新的模块,进行一个"热"替换,所谓的热替换是指在不需要刷新页面的情况下,对某个改动进行无缝更新。如果你没有配置 HMR,那么你每次改动,都需要刷新页面,才能看到改动之后的结果,对于调试来说,非常麻烦,而且效率不高,最关键的是,你在界面上修改的数据,随着刷新页面会丢失,而如果有类似 Webpack 热更新的机制存在,那么,则是修改了代码,不会导致刷新,而是保留现有的数据状态,只将模块进行更新替换。也就是说,既保留了现有的数据状态,又能看到代码修改后的变化。
发声的沉默者
2021/06/14
1.5K0
Webpack 如何配置热更新
webpack原理(1):Webpack热更新实现原理代码分析
服务单与客户端通信方式有:ajax 轮询,EventSource、websockt。
周陆军博客
2023/03/18
1.4K0
了不起的 Webpack HMR 学习指南(含源码分析)
学习时间:2020.06.14 学习章节:《Webpack HMR 原理解析》 [了不起的 Webpack HMR 学习指南.png]
pingan8787
2020/06/16
1.2K0
webpack中的HMR(热更新)原理剖析
Hot Module Replacement(以下简称 HMR)是 webpack 发展至今引入的最令人兴奋的特性之一 ,当你对代码进行修改并保存后,webpack 将对代码重新打包,并将新的模块发送到浏览器端,浏览器通过新的模块替换老的模块,这样在不刷新浏览器的前提下就能够对应用进行更新。
winty
2019/12/21
1.5K0
webpack配置优化,让你的构建速度飞起
越来越多的项目使用webpack5来构建项目了,今天给大家带来最前沿的webpack5配置,让我们代码在编译/运行时性能更好~
gogo2027
2022/10/03
2.5K0
Webpack 原理系列十:HMR 原理全解析
HMR 全称 Hot Module Replacement,中文语境通常翻译为模块热更新,它能够在保持页面状态的情况下动态替换资源模块,提供丝滑顺畅的 Web 页面开发体验。
Tecvan
2021/12/09
2.5K0
Webpack 原理系列十:HMR 原理全解析
webpack 热更新(实施同步刷新)
实现热更新,首先,安装一系列的node命令,如果嫌麻烦,你可以直接看解决方案二,相对来说比较简单。
White feathe
2021/12/08
8560
webpack 热更新(实施同步刷新)
webpack-dev-server 运行原理
现代 web 开发者们对于 webpack 想必已经很熟悉了,webpack-dev-server 几乎都是标配。但是 webpack-dev-server 背后的运行原理是怎样的呢?想了解 how 我们先看看 what。
WecTeam
2020/11/05
3.3K1
webpack-dev-server 运行原理
webpack高级配置
我主要是想说摇树失败的原因(tree shaking 失败的原因),先讲下摇树本身效果
gogo2027
2022/10/18
8290
Webpack知识点速记
Webpack是一个模块打包工具,在Webpack里一切文件皆模块。通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合的文件。Webpack专注构建模块化项目。 Webpack可以看作是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其他一些不能被浏览器直接运行的扩展语音(如:Scss,TypeScript等),并将其打包为合适的格式以供浏览器使用。
Clearlove
2019/08/29
9340
Webpack知识点速记
webpack5热更新打包TS
模块热替换(HMR - Hot Module Replacement)是 webpack 提供的最有用的功能之一。它允许在运行时替换,添加,删除各种模块,而无需进行完全刷新重新加载整个页面
玖柒的小窝
2021/09/22
2.2K0
webpack5热更新打包TS
推荐阅读
相关推荐
webpack热更新原理(面试大概率会问)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档