webpack中的热刷新与热加载的区别


Posted in Javascript onApril 09, 2018

webpack非常的强大,合理的脚手架可以为我们的工作省去众多繁琐无意义的工作。其中热刷新、热加载相较于传统开发大大提高了开发节奏。

从脚手架发现热刷新、热加载的差异

相信大部分的vue开发者都是从vue-cli开始的,很多初学者欢快的跑着vue项目却不敢改随意改变vue-cli的配置(毕竟webpack确实很复杂,vue-cli也做了很多工作来优化初学者的体验)。

相比之下react没有提供一个比较健壮的脚手架了(至少没有明显地被我找到,望赐教)。据我知一个是yeoman的 generator-react-webpack、react的create-react-app,还有一个不错的react-starter-kit (热加载,而且集成了非常多代码,参考性很高)。
在学习react时我就发现了上文提到的react前两个脚手架提供的是热刷新而非热加载。

简单的区分热加载与热刷新:

热刷新:文件内动改动后,整个页面刷新,不保留任何状态(比如输入过内容的Input表单),相当于webpack帮你摁了F5刷新
热加载:文件改动后,以最小的代价改变被改变的区域。尽可能保留改动文件前的状态(对input输入内容后,修改其他标签的代码)

这在虽然两者相较于传统开发(手动F5)都提升了开发体验,但两者之间的依旧很大,尤其是当项目变得愈发复杂之后,我们必须一劳永逸的解决这个问题(留出更多的时间来开发bug)。

动手修改

从头配置就是另一个领域了,所以我们直接从vue-cli开始改动。

下述步骤仅列出关键做启发参考,详细请参考最后github完整项目

  1. 删除vue相关的依赖、文件等;整个scr内的东西都可以删掉
  2. package.json依赖加入babel-loader webpack-dev-server react-hot-loader(最关键)
  3. package.json命令行设置 "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js"
  4. webpack.base.conf 添加.jsx文件需要经过babel-loader处理,配置options:{plugins:['react-hot-loader/babel']}
  5. .babelrc presets加入react,下方加入plugins:['react-hot-loader/babel']
  6. src文件夹下创建main.js(起名要跟webpack配置的入口文件一致)
import 'core-js/fn/object/assign';
import React from 'react';
import ReactDOM from 'react-dom';
import { hot } from 'react-hot-loader';

import App from './pages/App'; // 自己写吧
import './assets/css/reset.scss';

// Render the main component into the dom
ReactDOM.render(<App/>, document.getElementById('app'));

export default hot(module)(App); // 热加载的关键

至此,我们就可以愉快地使用react体验热加载的快♂感了~

问题所在

其实在简单地修改vue-cli中的main.js文件为react相关代码(别忘了配置babel处理jsx)并依旧是热刷新。

经过本地代码观察对比后,发现了一个吸引人的名字:

在webpack.dev.conf文件中:

new webpack.HotModuleReplacementPlugin()

网上查询后得知这是实现热加载的关键,它需要代码本身具备模块化的性质(这意味着只要像三大框架这样可编写可复用组件的框架都能利用这个性质),这样才可以通过插♂拔代码实现热加载。

而react的jsx特效不是HotModuleReplacementPlugin能搞定的只能老老实实热刷新了。

在这种情况下react-hot-loader呼之欲出。配合官方的使用方法,就能继续使用热加载了。

ps: 仅做参考,react的很多代码我也处于探索与学习中

配置好的项目地址:gayhub

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
禁止空格提交表单的js代码
Nov 17 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
批量修改标签css样式以input标签为例
Jul 31 Javascript
js实现表单多按钮提交action的处理方法
Oct 24 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 Javascript
angular select 默认值设置方法
Jun 23 Javascript
使用vue-router完成简单导航功能【推荐】
Jun 28 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
JavaScript适配器模式原理与用法实例详解
Mar 09 Javascript
js实现计算器功能
Aug 10 Javascript
js实现幻灯片轮播图
Aug 14 Javascript
vue写一个组件
Apr 09 #Javascript
Vue 中使用 CSS Modules优雅方法
Apr 09 #Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 #Javascript
vue脚手架及vue-router基本使用
Apr 09 #Javascript
vue 设置proxyTable参数进行代理跨域
Apr 09 #Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 #Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 #Javascript
You might like
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
详解用python生成随机数的几种方法
2019/08/04 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
python 日志 logging模块详细解析
2020/03/31 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
安全承诺书范文
2014/03/26 职场文书
班主任工作实习计划
2015/01/16 职场文书
后勤工作个人总结
2015/02/28 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
高三数学教学反思
2016/02/18 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python