webpack之文件监听及热更新

2021-05-08  本文已影响0人  LXEP

webpack 的文件监听

文件监听是在源码发生变化时,自动重新构建出新的输出文件。
webpack开启监听模式,有两种方式:

webpack文件监听的原理

webpack会轮询判断文件的最后编辑时间是否变化。
某个文件发生了变化,并不会立即告诉监听者,而是先缓存起来,等 aggregateTimeout

module.exports = {
    // 默认是false,即不开启
    watch: true,
    // 只有开启监听模式时,watchOptions才有意义
    watchOptions: {
        // 默认为空,不监听的文件或者文件夹,支持正则匹配
        ignored: /node_modules/,
        // 监听到变化发生后会等300ms再去执行,默认300ms
        aggregateTimeout: 300,
        // 判断文件是否发生变化是通过不停询问系统指定文件有没有变化实现的,默认每秒问1000次
        poll: 1000
    },
};

热更新

使用webpack-dev-server

安装依赖

npm i -D webpack-dev-server
{
  "name": "project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "webpack",
    "dev": "webpack-dev-server --open"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
}

因为WDS主要是在开发过程中使用,生产环境是用不到的,所以我们将mode改为development,然后再引入webpack自带的Hot ModuleReplacementPlugin插件,由于该插件是内置的,所以我们先引入webpack,再将插件加进来,最后还要配置一下devServer

const webpack = require('webpack');

module.exports = {
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ],
    devServer: {
        contentBase: './dist', // 服务的基础目录
        hot: true   // 开启热更新
    }
};

升级填坑

但是,当你升级webpack4 ---->webpack5时,如果你的版本是webpack-cli 4*时,就会报错

Error: Cannot find module 'webpack-cli/bin/config-yargs'

{
  "webpack": "^5.36.0",
  "webpack-cli": "^4.6.0",
  "webpack-dev-server": "^3.11.2"
}

这是,因为在webpack-cli 4*中,作者删除了config-yargs,所以会报错
这里有两种解决方案:

使用webpack-dev-middleware

WDM将webpack输出的文件传输给服务器,适用于灵活的定制场景。
使用这种方式,通常需要再引入一个server,一般是express或者koa

const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');

const app = express();
const config = require('./webpack.config.js');
const compiler = webpack(config);

app.use(webpackDevMiddleware(compiler, {
  publicPath: config.output.publicPath
}));

app.listen(3000, function(){
  console.log('Example app listening on port 3000!\n');
})

热更新原理分析

热更新的过程

上一篇 下一篇

猜你喜欢

热点阅读