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 相关文章推荐
js页面跳转的常用方法整理
Oct 18 Javascript
js传参数受特殊字符影响错误的解决方法
Oct 21 Javascript
js全选实现和判断是否有复选框选中的方法
Feb 17 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 Javascript
jquery实现楼层滚动效果
Jan 01 jQuery
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
详解React中setState回调函数
Jun 14 Javascript
基于jQuery实现的设置文本区域的光标位置
Jun 15 jQuery
JS实现select选中option触发事件操作示例
Jul 13 Javascript
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
JS自定义对象创建与简单使用方法示例
Jan 15 Javascript
ant design vue导航菜单与路由配置操作
Oct 28 Javascript
详解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+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
php实例化一个类的具体方法
2019/09/19 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
Highcharts入门之简介
2016/08/02 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
pandas通过索引进行排序的示例
2018/11/16 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
英文版销售经理个人求职信
2013/11/20 职场文书
公司成立感言
2014/01/11 职场文书
一年级学生期末评语
2014/04/21 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
运动会100米加油稿
2015/07/21 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
Python机器学习三大件之一numpy
2021/05/10 Python
详解MySQL中的主键与事务
2021/05/27 MySQL
angular异步验证器防抖实例详解
2022/03/31 Javascript