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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
JavaScript 程序编码规范
Nov 23 Javascript
JavaScript编程的10个实用小技巧
Apr 18 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
原生js和jQuery随意改变div属性style的名称和值
Oct 22 Javascript
使用命令对象代替switch语句的写法示例
Feb 28 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 Javascript
Ajax和Comet技术总结
Feb 19 Javascript
js实现放大镜特效
May 18 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
vue props 单项数据流实例分享
Feb 16 Javascript
JS+Canvas实现五子棋游戏
Aug 26 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
基于mysql的论坛(2)
2006/10/09 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
javascript常用函数(2)
2015/11/05 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
python中数据爬虫requests库使用方法详解
2018/02/11 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
python如何删除文件中重复的字段
2019/07/16 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
python使用建议与技巧分享(二)
2020/08/17 Python
python进度条显示之tqmd模块
2020/08/22 Python
留学自荐信写作方法
2014/01/27 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
武夷山导游词
2015/02/03 职场文书
上诉状格式
2015/05/23 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python