HMR :hot module replacement 热模块替换
作用:一个模块发生变化,只会重新打包这一个模块(而不是打包所有模块)
极大地提升构建速度

  1. 样式文件:可以使用HMR功能:因为style-loader内部实现了<br /> js文件:默认没用HMR功能 -->需要修改js代码,添加支持HMR功能的代码<br /> 注意:HMR功能对js的处理,只能处理非入口js文件的其他文件<br /> html文件:默认不能使用HMR功能,同时会导致问题:html文件不能热更新了<br /> 解决:修改entry入口,将html文件引入

webpack.config.js

/**
HMR :hot module replacement 热模块替换
    作用:一个模块发生变化,只会重新打包这一个模块(而不是打包所有模块)
    极大地提升构建速度

    样式文件:可以使用HMR功能:因为style-loader内部实现了
    js文件:默认没用HMR功能 -->需要修改js代码,添加支持HMR功能的代码
    注意:HMR功能对js的处理,只能处理非入口js文件的其他文件
    html文件:默认不能使用HMR功能,同时会导致问题:html文件不能热更新了
        解决:修改entry入口,将html文件引入
 */


const{resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    entry:['./src/js/index.js','./src/index.html'],
    output:{
        filename:'js/built.js',
        path:resolve(__dirname,'build')
    },
    module:{
        rules:[
            //loader配置
            {
                //处理less资源
                test:/\.less$/,
                use:['style-loader','css-loader','less-loader']
            },
            {
                //处理css资源
                test:/\.css$/,
                use:['style-loader','css-loader']
            },
            {
                //处理图片资源
                test:/\.(jpg|png|gif)$/,
                loader:'url-loader',
                options:{
                   limit:8*1024,
                   name:'[hash:10].[ext]',
                   //关闭es6模块
                //    esModule:false,
                //输出文件到imgs文件夹
                   outputPath:'imgs'
                }
            },
            {
                //处理html中的img资源
                test:/\.html$/,
                loader:'html-loader'
            },
            {
                //处理其他资源
                exclude:/\.(html|js|css|less|jpg|png|gif)$/,
                loader:'file-loader',
                options:{
                   name:'[hash:10].[ext]',
                   //输出文件到media文件夹
                   outputPath:'media'
                }
            },
        ]
    },
    plugins:[
        //plugins的配置
        new HtmlWebpackPlugin({
            template:'./src/index.html'
        })
    ],
    mode:'development',
    devServer:{
        contentBase:resolve(__dirname,'build'),
        compress:true,
        port:8080,
        open:true,
        //开启HMR功能
        //当修改了webpack配置,想要新配置生效,必须重启webpack服务
        hot:true
    }
}

非入口js文件 print.js

console.log('print文件被加载了')

function print(){
    const content = 'hello print'
    console.log(content)
}

export default print

入口js文件 index.js

import print from './print'

import '../css/iconfont.css'
import '../css/index.less'

console.log('dbauibdasbdu')

function add(a,d){
    return a+d
}
console.log(add(5,8))

if(module.hot){
    //一旦module.hot为true。说明开启了HMR功能 -->让HMR功能代码生效
    module.hot.accept('./print.js',function(){
    //方法会监听print.js文件的变化,一旦发生变化,其他默认不会重新打包构建
    //会执行后面的回调函数
    print();
    })
}