上一章对webpack的配置有了简单的认识。

这一章,我需要学习的是webpack热更新,因为在开发过程中,不希望当文件更改时,人肉去编译文件,刷新浏览器。

webpack热更新

webpack-dev-server 自动刷新

webpack-dev-server 为你提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading)。

实际操作一下。

我们先创建一个项目

mkdir dev-erver && cd dev-server

npm init -y // 快速创建一个项目配置

npm i webpack webpack-dev-server webpack-cli --save-dev

mkdir src // 创建资源目录

mkdir dist // 输出目录

touch webpack.dev.js // 因为是在开发环境需要热更新,所以直接创建dev配置文件

复制代码

先编写一下配置文件,我们就简单地编写多入口配置

'use strict';

const path = require('path');

module.exports = {

entry: './src/index.js',

output: {

path: path.resolve(__dirname, 'dist'),

filename: 'index.js'

},

mode: 'development',

devServer: {

contentBase: path.resolve(__dirname, 'dist')

}

};

复制代码

然后我们去src创建文件,编写内容

index.js

'use strict'

document.write('hello world~')

复制代码

准备就绪,我们就可以启动webpack-dev-server,在package.json里添加一条命令

"scripts": {

"test": "echo \"Error: no test specified\" && exit 1",

+ "dev": "webpack-dev-server --config webpack.dev.js --open"

},

复制代码

运行一下

npm run dev

复制代码

我们看到文件已经打包完成了,但是在dist目录里并没有看到文件,这是因为WDS是把编译好的文件放在缓存中,没有磁盘上的IO,但是我们是可以访问到的

http://localhost:8080

复制代码

配置告知 webpack-dev-server,在 localhost:8080下建立服务,将 dist 目录下的文件,作为可访问文件,所以我们可以直接输入bundle.js的地址查看

http://localhost:8080/index.js

复制代码

显然我们想看效果而不是打包后的代码,所以我们在dist目录里创建一个html文件引入即可

index.html

复制代码

这个时候我们访问

http://localhost:8080

复制代码

内容出来了,我们接下来修改index.js文件,来看下是否可以自动刷新

'use strict'

document.write('hello world~byebye world')

复制代码

web 服务器就会自动重新加载编译后的代码

这确实是热更新,但是这种是每一次修改会重新刷新整个页面,大家可以打开控制台查看。

显然这还是不满足不我们的需求。

webpack-dev-server搭配HotModuleReplacementPlugin 实现热更新

我们需要的是,更新修改的模块,但是不要刷新页面。这个时候就需要用到模块热替换。

模块热替换(Hot Module Replacement 或 HMR)是 webpack 提供的最有用的功能之一。它允许在运行时更新各种模块,而无需进行完全刷新。

特性:

模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面。主要是通过以下几种方式,来显著加快开发速度:

保留在完全重新加载页面时丢失的应用程序状态。

只更新变更内容,以节省宝贵的开发时间。

调整样式更加快速 - 几乎相当于在浏览器调试器中更改样式。

启用

启用HMR,其实十分简单,修改下webpack-dev-server的配置,和使用webpack内置的HMR插件即可。

'use strict';

const path = require('path');

+ const webpack = require('webpack');

module.exports = {

entry: './src/index.js',

output: {

path: path.resolve(__dirname, 'dist'),

filename: 'index.js'

},

mode: 'development',

devServer: {

contentBase: path.resolve(__dirname, 'dist'),

+ hot: true

},

module: {

rules: [

{

test: /\.(html)$/,

use: {

loader: 'html-loader'

}

}

]

},

+ plugins: [

+ new webpack.HotModuleReplacementPlugin()

+ ]

};

复制代码

我们修改一下文件,形成引用关系

index.js

'use strict'

import { test } from './page1.js'

document.write('hello world~1234')

test()

复制代码

page1.js

'use strict'

module.exports = {

test: function () {

console.log(11123456)

}

}

复制代码

在入口页index.js面再添加一段

if (module.hot) {

module.hot.accept();

}

复制代码

OK,接下来执行

npm run dev

复制代码

然后我们修改page1.js,会发现页面并没有刷新,只是更新了部分文件

这样我们的热更新就实现了。

原理

整个的过程我们可以简化一下,

Webpack Compile打包文件传输给Bundle Server,Bundle Server就是一个服务器,然后会执行这些编译后的文件,让浏览器可以访问到。当文件产生变化时,Webpack Compile编译之后会通知到HMR Server,HMR Server就会通知浏览器端的HMR Runtime做出修改。

HMR Runtime是会被打包到编译后的js文件内,然后和HMR Server建立websocket通信关系,这样就可以实时更新修改。

链接文章

I am moving forward.

修改html时webpack热更新,webpack学习之路(二)webpack-dev-server实现热更新相关推荐

  1. pwn学习总结(二) —— 基础知识(持续更新)

    pwn学习总结(二) -- 基础知识(持续更新) Canary PLT表&GOT表 格式化字符串漏洞 GCC编译参数 ASLR 危险函数 输入流 syscall条件 shellcode 其它 ...

  2. 前端Vue学习之路(二)-Vue-router路由

    Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...

  3. Hive学习之路(二):Hive表操作详讲

    操作内容简介 一.操作前的准备 二.Hive表操作详讲 1. 创建数据库 2. 查看所有数据库/表 3. 在Hive上直接操作HDFS 4. 在Hive上直接执行终端命令 5. 创建数据表/查看表的信 ...

  4. python 剑指offer 学习之路(二)

    剑指offer 学习之路 合并两个排序的链表 树的子结构 顺时针打印矩阵 包含min函数的栈 从上往下打印二叉树 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 数组中出现次数超过 ...

  5. webpack学习之路(四)webpack-hot-middleware实现热更新

    上一节我学习了webpack-dev-middleware,但是单独使用它并没有实现热更新,所以这节我要学习搭配使用webpack-hot-middleware,来实现热更新功能. 创建项目 我们依然 ...

  6. mat opencv 修改roi_设置图片ROI(OpenCV学习笔记之二)

    ROI相关简介 ROI是什么 ROI是region of interest首字母的简写,翻译为感性趣的区域.其实在写本篇之前应该写一篇关于图片是什么的学习笔记,但又感觉里面没多少东西还不能承载一篇学习 ...

  7. HBase学习之路(二):Java客户端的CRUD操作详讲

    内容简介 一.概述 二.操作前的准备 三.put操作 1.单行put方法 2.使用Put列表 四.get操作 1.单行get方法 2.使用Get列表 五.delete操作 1.单行delete方法 2 ...

  8. Object-c学习之路二(oc内存管理黄金法则1)

    今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误.下面以人和读书的例子做练习. 1.主函数 // // main.m // MemoryManage ...

  9. zigbee学习之路(二)点亮LED

    一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...

  10. MyBatis的学习之路(二)

    上篇文章介绍了MyBatis的配置文件,现在来介绍实体映射文件Mapper.xml. 说道实体映射文件,就不得不说一下实体与表之间的映射关系:单表映射和多表映射. a. 单表映射 1 public c ...

最新文章

  1. python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)
  2. 读完这本书,我做了一个APP
  3. ORACLE 11G RAC ASM磁盘全部丢失后的恢复
  4. pycharm 如何搜索?Ctrl+N 搜索py文件 Ctrl+shift+N 搜索所有类型的文件 ctrl+shift+f 全局字符串搜索 ctrl+shift+a 配置项搜索 双shift全局
  5. 12年外贸婚纱跨境老司机分享独立站推广引流实操干货
  6. iOS Category 和 Extention 的本质区别【面试必备】
  7. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_06maven标准目录结构...
  8. XJOI一级五段题解(g++,即C++),也可视作C++算法竞赛教程
  9. w10控制面板卸载java_手把手教你解决Win10控制面板无法卸载软件的问题
  10. UG NX 12 基准轴
  11. 为什么你的前端工作经验不值钱?
  12. 06CookieSession-12. HttpSession的钝化和活化
  13. Obi Cloth 仿真布 学习
  14. 四、Vue项目去哪儿网首页推荐和周末游组件并使用Axios获取数据
  15. 谷歌地球基本简介及趣味功能
  16. Android Weekly #35 知识工作者就是管理者——虽未管人,但在管事
  17. OpenFOAM量纲及常用物理量的表达形式
  18. CAN通信(一)——认识CAN总线
  19. STM32学习笔记——结构体
  20. EXt的数据加载与展示

热门文章

  1. hmac-sha1加密算法C源码示例
  2. linux进程间通信:POSIX 消息队列
  3. nyoj——297(期望)
  4. MyBatis中#{}和${}的区别
  5. 解决keepalived脑裂问题
  6. Python之路【第五篇】:面向对象及相关
  7. 丁贵才130702010042第二次作业
  8. 关于android布局的两个属性dither和tileMode,background 平铺
  9. 转_前端开发技术概要
  10. CMake学习(一)