webpack热模块替换(HMR)/热更新的方法


Posted in Javascript onApril 05, 2018

这是一篇关于webpack热模块替换的最简单的配置(不需要react),也称作热更新。

模块热替换(HMR)的作用是,在应用运行时,无需刷新页面,便能替换、增加、删除必要的模块。 HMR 对于那些由单一状态树构成的应用非常有用。因为这些应用的组件是 “dumb” (相对于 “smart”) 的,所以在组件的代码更改后,组件的状态依然能够正确反映应用的最新状态。

webpack-dev-server内置“live reload”,会自动刷新页面。

文件目录如下:

  1. app
    1. a.js
    2. component.js
    3. index.js
  2. node_modules
  3. package.json
  4. webpack.config.js

component.js中导入了a.js。index.js导入了component.js。修改任意一个文件,都能达到热更新功能。

最重要的是,在index.js中,有这样一段代码:(完成热更新必须需要)

if(module.hot){
  module.hot.accept(moduleId, callback);
}

下面是package.json配置:

{
 "name": "webpack-hmr",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
  "start": "nodemon --watch webpack.config.js --exec \"webpack-dev-server --env development\"",
  "build": "webpack --env production"
 },
 "keywords": [],
 "author": "",
 "license": "ISC",
 "devDependencies": {
  "html-webpack-plugin": "^2.28.0",
  "nodemon": "^1.11.0",
  "webpack": "^2.2.1",
  "webpack-dev-server": "^2.4.1"
 }
}

从依赖就可以看到,这真的是一个最简单的配置了。其中nodemon用来监听webpack.config.js文件的状态,只要发生改变,就重新执行命令。

关于”html-webpack-plugin”,在这里是可以省略的。具体的配置请看:https://www.npmjs.com/package/html-webpack-plugin 。

在这里,定义了两个命令,一个是start,用于开发环境;一个是build,用于生产环境。--watch用来监听一个或者多个文件,--exec是nodemon用来执行其它的命令。具体的配置请看:https://c9.io/remy/nodemon。

接下来是webpack.config.js了,既然package.json的scripts中定义了两种命令,我们还是要在配置文件中实现两种情况(development和production,你也可以修改配置其中一种)。

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');

const PATHS = {
 app: path.join(__dirname, 'app'),
 build: path.join(__dirname, 'build'),
};

const commonConfig={
 entry: {
  app: PATHS.app + '/index.js',
 },
 output: {
  path: PATHS.build,
  filename: '[name].js',
 },
 watch: true,
 plugins: [
  new HtmlWebpackPlugin({
   title: 'Webpack demo',
  }),
 ],
}

function developmentConfig(){
 const config ={
  devServer:{
   historyApiFallback:true, //404s fallback to ./index.html
   // hotOnly:true, 使用hotOnly和hot都可以
   hot: true,
   stats:'errors-only', //只在发生错误时输出
   // host:process.env.Host, 这里是undefined,参考的别人文章有这个
   // port:process.env.PORT, 这里是undefined,参考的别人文章有这个
   overlay:{ //当有编译错误或者警告的时候显示一个全屏overlay
    errors:true,
    warnings:true,
   }
  },
   plugins: [
   new webpack.HotModuleReplacementPlugin(),
   new webpack.NamedModulesPlugin(), // 更新组件时在控制台输出组件的路径而不是数字ID,用在开发模式
   // new webpack.HashedModuleIdsPlugin(), // 用在生产模式
  ],
 };
 return Object.assign( 
  {},
  commonConfig,
  config,
  {
   plugins: commonConfig.plugins.concat(config.plugins),
  }
 );
}

module.exports = function(env){
 console.log("env",env);
 if(env=='development'){
  return developmentConfig();
 }
 return commonConfig;
};

关于Object.assign,第一个参数是目标对象,如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。浅赋值,对于对象的复制使用=,即引用复制。

env参数通过cli传入。

然后打开命令行到当前目录,运行npm start或者npm run build就好啦。注意,前者是在开发环境下,是没有输出文件的(在内存),只有运行后者才会有输出文件。

demo的代码在:https://github.com/yuwanlin/webpackHMR

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

Javascript 相关文章推荐
关于IE7 IE8弹出窗口顶上
Dec 22 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
每日十条JavaScript经验技巧(一)
Jun 23 Javascript
深入浅析search 搜索框的写法
Aug 02 Javascript
基于vue.js实现图片轮播效果
Dec 01 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
Sep 18 Javascript
vuex 使用文档小结篇
Jan 11 Javascript
vue iview实现动态路由和权限验证功能
Apr 17 Javascript
Angular异步变同步处理方法
Aug 13 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
使用pkg打包ThinkJS项目的方法步骤
Dec 30 Javascript
JavaScript或jQuery 获取option value值方法解析
May 12 jQuery
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 #Javascript
express默认日志组件morgan的方法
Apr 05 #Javascript
React Native悬浮按钮组件的示例代码
Apr 05 #Javascript
关于Google发布的JavaScript代码规范你要知道哪些
Apr 04 #Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 #Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
Apr 04 #Javascript
vue基于mint-ui实现城市选择三级联动
Jun 30 #Javascript
You might like
PHP四种基本排序算法示例
2015/04/09 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&”)
2016/12/23 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Python unittest单元测试框架总结
2018/09/08 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
小学后勤管理制度
2014/01/14 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
合作协议书范本
2014/10/25 职场文书
通知的写法
2015/04/23 职场文书
实施意见格式范本
2015/06/05 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python