Webpack
对于现代前端开发者,想必是至关熟悉了,在不少项目中,应用很是普遍,而 webpack-dev-server
,相信你们应该也都接触过。最近,做者在配置多入口,热更新在单入口是好使的,结果到了多入口很差使?,而后经过 Google 寻找答案,找到了一篇 issue
,HMR not working with multiple entries,跟个人问题相似,好像真的有 BUG?看到做者回复css
v4 修复了该问题,我丢,我还在使用 v3,翻看 v4 文档html
此时,只有一个感受,热更新都多久的东西了,不该该存在多入口,热更新有问题吧?升级到 v4 以后,仍是不行,当时我这暴脾气就上来了,直接翻看源码。翻看源码以前,首先要对热更新是个什么,有个基础的了解。前端
模块热更新(Hot Module Replacement)是指在浏览器运行过程当中,替换、添加或删除模块,而无需从新加载整个页面。node
CSS/JS
进行修改,会马上在浏览器中进行更新,并只更新改变的内容,节省开发时间对比 Live Reload
方案,HMR
体现了其强大之处,实时模块热刷新和保存应用状态,极大的提升了开发效率和开发体验。webpack
HMR
的启用十分简单,一个带有热更新功能的 webpack.config.js
文件的配置以下:git
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.jsgithub
if (module.hot) { module.hot.accept(); }
网上关于 Webpack
热更新原理文章不少,这里就不详细描述了,推荐几个。web
$ git clone https://github.com/webpack/webpack-dev-server.git
必定要找到你项目中对应的版本包,对号入座噢,不然会报错,把 webpack-dev-server
项目拉下来以后,尝试在 webpack-dev-server/lib/Server.js
该文件增长一行 console.log
npm
而后进入根目录浏览器
$ cd webpack-dev-server $ npm link
生成软链
cd 项目地址 npm link webpack-dev-server
link 成功以后,会提示下面,更换了 webpack-dev-server 地址
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
去查
找,若是这个依赖不支持多例,应用就会异常。
在开发和创做多个包(私有或公共)时,您常常发现本身须要在本地环境中正在处理的其余项目中使用最新/WIP 版本,而无需将这些包发布到远程注册中心。NPM 和 Yarn 使用相似的符号连接包( npm/yarn link)方法解决了这个问题。虽然这在许多状况下可能有效,但它常常带来使人讨厌的约束和依赖解析、文件系统之间的符号连接互操做性等问题。
全局安装 yalc
npm install -g yalc
生成 yalc 包
$ cd webpack-dev-server $ yalc publish
能够在本身本地 /Users/jiang/.yalc/packages/webpack-dev-server
,找到对应的包
cd 项目地址 yalc link webpack-dev-server
link 后,能够在本身项目下,找到 .yalc
每次手动修改第三方库的代码,都须要手动 link,就很麻烦,对不对?ok,神器来了,nodemon
,
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
,新增三行可执行命令
运行下 npm run watch
,而后每次修改,都会自动更新,是否是很舒服?
<img width="119" alt="WeChat7c8e2813667093e82dc47a836e6d5cdb" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6fcceba8aa0543799b4e897141912f13~tplv-k3u1fbpfcp-zoom-1.image">
找到对应的文件位置和代码行数,经过浏览器进行断点调试,这个就不展开讲了。
通过一番折腾,升级 webpack-dev-server@v4
,原理分析,源码调试,与以前正常的单页应用进行对比,发现都是正常的,仍是不行,我就郁闷了,为什么呢?忽然之间,我悟了,好像多页应用没有在入口进行 module.hot
以前在 app.jsx
中写的 module.hot
改在入口文件 进行 module.hot
ok,成功,喜大普奔。
带着问题,阅读源码是最高效的,这样你在阅读源码的过程当中也不会感到无聊,由于你是要解决问题,才会去看源码,对于不懂的代码,一点一点调试,一步一步走下去,再结合现有的一些原理文章(站在巨人的肩膀上)就会找到答案。此次的经历,也算颇有意思,感谢小伙伴们的阅读,喜欢的能够点个赞噢 🌟 ~