Skip to content

webpack中的热更新

本节来学习一下webpack中的热更新操作。

在之前的开发中,每次更新代码,都会导致页面的刷新,但是我们只想更新我们改变的那部分代码,不让页面重新刷新。

因此就可以使用webpack的热更新

热更新

修改配置文件

js
// webpack-optimize\webpack.config.js

let path = require('path')

// 插件 用来复制html入口模板,到打包后的目录,并把打包后的js文件,以script标签的形式塞到模板文件里
let HtmlWebpackPlugin = require('html-webpack-plugin')

let Webpack = require('webpack')

module.exports = {
    mode: 'development', // 模式,默认两种模式 production 和 development

    entry: {
        index: './src/index.js',
    },

    devServer: { // 开发服务器的配置
        port: 3000, // 默认端口是8080,这里可以改
        progress: true, // 打包时候的进度条
        contentBase: './dist', // 以哪个文件夹作为服务的根目录 ,如果有就直接使用,没有的话就使用内存中的
        open: true, // 服务启动完毕后,直接打开浏览器
        compress: true, // 启动gzip压缩

        hot: true, // 启用热更新
    },


    // 打包后的输出路径
    output: {
        filename: '[name].js', // 打包后的文件名
        path: path.resolve(__dirname, 'dist'), // 打包后输出的路径
    },

    // 配置一些loader
    module: {
        rules: [
            {
                test: /\.js$/,
                use: {
                    loader: 'babel-loader',
                    // 配置一些它的选项
                    options: {
                        // 配置预设,有多个
                        presets: [
                            '@babel/preset-env', // 用来解析es6
                            '@babel/preset-react', // 用来解析react语法,jsx
                        ],
                        // 模块懒加载 插件(现在好像已经不用安装了)
                        plugins: [
                            '@babel/plugin-syntax-dynamic-import',
                        ],
                    }
                }
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader'],
            },
        ]
    },
    // 注册插件
    plugins: [
        // 热更新辅助插件
        new Webpack.NamedModulesPlugin(), // 打印更新的模块路径
        new Webpack.HotModuleReplacementPlugin(), // 热更新插件
        new HtmlWebpackPlugin({
            template: './public/index.html', // 模板的位置
        }),
    ]
}

修改index.js

js
// webpack-optimize\src\index.js

import str from './source.js'
console.log(str);


// 增加的热更新打印日志
if (module.hot) { // 如果该模块支持热更新
    module.hot.accept('./source.js', () => {
        console.log('文件更新了');
        // 发现文件更新之后就可以重新引用一下这个代码
        let str = require('./source.js')
        // 然后重新走一遍这个逻辑,就实现了热更新
        console.log(str.default);
    })
}

这样配置后,一旦source.js文件变更了,就会重新加载该模块代码,并且重新走一遍逻辑,并不会刷新页面。

总结

热更新就是代码变更后,不刷新页面,只重新执行变动部分的代码。

原先webpack在未启动热更新时,一旦代码发生改变,就会刷新页面,全部重新加载一遍。启动热更新后就能实现局部刷新的效果。

js
let Webpack = require('webpack')

module.exports = {
    devServer: { // 开发服务器的配置
        hot: true, // 启用热更新
    },

    // 注册插件
    plugins: [
        // 热更新辅助插件
        new Webpack.NamedModulesPlugin(), // 打印更新的模块路径
        new Webpack.HotModuleReplacementPlugin(), // 热更新插件
    ]
}

在代码中也需要监听一下,代码是否改变,改变的话重新加载一下变动部分的资源

js
import str from './source.js'
console.log(str);


// 增加的热更新打印日志
if (module.hot) { // 如果该模块支持热更新
    module.hot.accept('./source.js', () => {
        console.log('文件更新了');
        // 发现文件更新之后就可以重新引用一下这个代码
        let str = require('./source.js')
        // 然后重新走一遍这个逻辑,就实现了热更新
        console.log(str.default);
    })
}

参考

https://www.bilibili.com/video/BV1a4411e7Bz?p=27&spm_id_from=pageDriver