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 相关文章推荐
jQuery Ajax之load()方法
Oct 12 Javascript
JavaScript判断一个URL链接是否有效的实现方法
Oct 08 Javascript
javascript一元操作符(递增、递减)使用示例
Aug 07 Javascript
使用原生JS实现弹出层特效
Dec 22 Javascript
JS实现的网页倒计时数字时钟效果
Mar 02 Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
学习使用ExpressJS 4.0中的新Router的用法
Nov 06 Javascript
es6函数之rest参数用法实例分析
Apr 18 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 Javascript
nuxt 每个页面head标签内容设置方式
Nov 05 Javascript
如何使用 vue-cli 创建模板项目
Nov 19 Vue.js
详解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中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
php 类自动载入的方法
2015/06/03 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
python实现接口并发测试脚本
2019/06/25 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
思想品德自我鉴定
2013/10/12 职场文书
实习生评语
2014/04/26 职场文书
中小企业员工手册范本
2015/05/14 职场文书
观看建国大业观后感
2015/06/01 职场文书
七一慰问简报
2015/07/20 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
Go语言设计模式之结构型模式
2021/06/22 Golang
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android
MySQL中order by的执行过程
2022/06/05 MySQL