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 相关文章推荐
$.format,jquery.format 使用说明
Jul 13 Javascript
仿jQuery的siblings效果的js代码
Aug 09 Javascript
javascript学习基础笔记之DOM对象操作
Nov 03 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
Nov 19 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
javascript的tab切换原理与效果实现方法
Jan 10 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
Spring mvc 接收json对象
Dec 10 Javascript
vue使用watch 观察路由变化,重新获取内容
Mar 08 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
详解小程序循环require之坑
Mar 08 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
Jul 29 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中文件上传的安全问题
2006/10/09 PHP
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
jQuery:unbind方法的使用详解
2017/08/14 jQuery
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
python下载文件记录黑名单的实现代码
2017/10/24 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python将字母转化为数字实例方法
2019/10/04 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
会计专业个人自我鉴定
2014/03/21 职场文书
百日安全生产活动总结
2014/07/05 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
2019同学聚会主持词
2019/05/06 职场文书
Python实现byte转integer
2021/06/03 Python
python实现局部图像放大
2021/11/17 Python