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高级程序设计(第3版)学习笔记11 内建js对象
Oct 11 Javascript
jQuery选择器中含有空格的使用示例及注意事项
Aug 25 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
JavaScript中计算网页中某个元素的位置
Jun 10 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
Dec 14 Javascript
原生js封装二级城市下拉列表的实现代码
Jun 16 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
Sep 01 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
angularjs项目的页面跳转如何实现(5种方法)
May 25 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
浅谈vue-router2路由参数注意的问题
Nov 08 Javascript
vue-router传参用法详解
Jan 19 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实现的MySQL通用查询程序
2007/03/11 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
php中取得文件的后缀名?
2012/02/20 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
JS交换变量的方法
2015/01/21 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
Python利用ansible分发处理任务
2015/08/04 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
如何理解委托
2012/01/06 面试题
高中军训感言400字
2014/02/24 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
审计专业自荐信范文
2014/04/21 职场文书
六年级学生评语
2014/04/22 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
学风建设演讲稿
2014/09/12 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
先进基层党组织材料
2014/12/25 职场文书
闪闪红星观后感
2015/06/08 职场文书
焦点访谈观后感
2015/06/11 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android