关于webpack的网上最认真细致的hmr解析


谈到webpack想必大家都不陌生,在前端工程化大行其道的今天,大多数开发者都在用类似webpack, fis3,rollup,gulp,grunt等等的前端项目的打包构建工具。今天的猪脚就是webpack的hot module replacement,说道hmr想必大家会有所熟悉,这不就是更改源码,页面在不刷新的情况下某个模块做出改变吗?然而,或许大多数开发者看到的往往是页面的刷新所带来的源码更改效果,这个结果就违背了我们践行hmr技术的初衷了,原因呢,就是我们队配置不是很熟悉,所以今天我们需要仔细梳理一下hmr技术需要做到哪些准备。

本教程基于nodejs的api去实现,这样可以做到对流程最大化的控制。

1. 首先确webpack的配置对象的entry入口添加两个文件。

  对于在nodejs的api下,devserver是无法读取webpack的配置的,所以我们需要手动在入口处添加客户端文件,并且deverser的hot等配置项是无效的。

 1 var config = require('config');
 2 var webpack = require('webpack');
 3 var webpackDevServer = require('webpack-dev-server');
 4 
 5 var path = require('path');
 6 
 7 var webpackConfig = require('../build/webpack.dev.config'); // 导入webpack配置对象
 8 
 9 process.env.NODE_ENV = 'development';
10 
11 var name = config.get('name');
12 
13 webpackConfig.entry.unshift('webpack/hot/dev-server'); // 注入hot插件后的客户端文件,可以监听到某个模块去冒泡更新
14 webpackConfig.entry.unshift('webpack-dev-server/client?http://localhost:8080'); // 注入devserver客户端可以开启inilne模式监听源码变动,使其得到更新
15 var compiler = webpack(webpackConfig);// 编译配置并生成compiler对象
16 
17 var server = new webpackDevServer(compiler, { // 生成devserver对象
18 });
19 
20 server.listen(8080);

 

2. 确保配置的插件项里添加了webpack.HotModuleReplacement的这个插件

 1 var path = require('path');
 2 var webpack = require('webpack');
 3 var htmlWebpackPlugin = require('html-webpack-plugin');
 4 var openBrowserPlugin = require('open-browser-webpack-plugin');
 5 
 6 module.exports = {
 7     entry: [path.join(__dirname, '../src/index.js')],
 8     output: {
 9         path: path.join(__dirname, '../dist'),
10         filename: '[name].[hash].js',
11         publicPath: '/'
12     },
13     plugins: [
14         new htmlWebpackPlugin({
15             filename: 'index.html',
16             template: path.join(__dirname, '../public/index.html'),
17             inject: 'body'
18         }),
19         new webpack.HotModuleReplacementPlugin()
20     ],
21     module: {},
22 }

3. 在项目的入口处理module.hot.accept

 1 if (module.hot) {
 2   module.hot.accept(() => {
 3     ReactDom.render(
 4         <App />,
 5         document.getElementById('root')
 6     )
 7   })
 8 }
 9 
10 ReactDom.render(
11     <App />,
12     document.getElementById('root')
13 )

当然,到这里我们就实现了hmr所需要的所有配置了,但是呢,我们更改的诸如react的state会重置,所以,如果需要保留react的状态的话,我们还需要react-hot-loader插件。

4. 添加react-host-loader

  可以直接参考官网的栗子 https://github.com/gaearon/react-hot-loader

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM