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 相关文章推荐
实例:尽可能写友好的Javascript代码
Oct 09 Javascript
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
Apr 11 Javascript
EasyUi datagrid 实现表格分页
Feb 10 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
Dec 16 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
Mar 18 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
帝国cms首页列表页实现点赞功能
Oct 30 Javascript
jQuery实现的页面详情展开收起功能示例
Jun 11 jQuery
Bootstrap的aria-label和aria-labelledby属性实例详解
Nov 02 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
Feb 27 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 Server的两个日期处理函数
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php adodb介绍
2009/03/19 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python动态参数用法实例分析
2015/05/25 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
python实现手机销售管理系统
2019/03/19 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
Lucene推荐的分页方式是什么?
2015/12/07 面试题
客服工作职责
2013/12/11 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
医院工作检讨书范文
2014/02/10 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
小浪底导游词
2015/02/12 职场文书
导游词格式
2015/02/13 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python