文件监听、热更新

287 阅读2分钟

一、文件监听

文件监听能让我们在文件更改保存之后,自动的打包文件。

配置方法有两种:

  • 在package.json的scripts中的启动命令行中加上--watch。
  • 在webpack.config.js中配置watch: true。

原理:

webpack会轮询的检测文件是否更新,会将最后一次更新的时间进行记录,当下次文件更新时,webpack会对这两个时间进行对比,如果不一致,就将更改文件列表进行缓存,并且等待一段时间,这段时间内如果有更改,就一起缓存,等时间到了,将更改文件一起构建,生成到bundle文件里。

存放路径:本地的磁盘中。

这种有一个缺点,就是每次更改,都要手动的更新浏览器。

二、热更新

热更新,更改完代码保存之后,webpack自动打包,浏览器不刷新,只更改修改的依赖代码。

1、使用webpack-dev-server和HotModuleReplacementPlugin(内置)插件。

基础配置:

package.json的scripts中:

增加"dev": "webpack-dev-server"。

webpack.config.js中:

const path = require("path");const HtmlWebpacPlugin = require("html-webpack-plugin");const webpack = require("webpack");module.exports = {  mode: "development",  entry: "./src/index.js",  output: {    path: path.join(__dirname, "dist"),    filename: "bundle.js",  },  module: {    rules: [      {        test: /\.js$/,        use: "babel-loader",      },      {        test: /\.(jpg|png|jpeg|gif)$/,        use: {          loader: "file-loader",          options: {            name: "[name]_[hash].[ext]",            outputPath: "imgs/",          },        },      },    ],  },  plugins: [new webpack.HotModuleReplacementPlugin()],  devServer: {    contentBase: path.join(__dirname, "dist"),    hot: true,  },};

增加了webpack的内置插件HotModuleReplacementPlugin,并且配置了devServer,webpack服务器在访问资源时的配置,contentBase是路径,hot为是否开启热更新。

存放路径:存在内存中。

2、使用webpack-dev-middleware

官方文档上说,webpack-dev-middleware是一个封装器,可以将webpack处理过的文件发送给浏览器,中间我们可以进行一些自定义的操作。webpack-dev-server内部也是使用的它。

首先在package.json的scripts配置"server":"node server.js"。

创建一个server.js文件,内容为:

const express = require("express");const webpack = require("webpack");const webpackDevMiddleware = require("webpack-dev-middleware");const app = express();const config = require("./webpack.config.js");const complier = webpack(config);app.use(  webpackDevMiddleware(complier, { publicPath: config.output.publicPath }));app.listen(3000, function () {  console.log("listening 3000");});

可以使用app.use对wepack处理过的文件进行自定义。

三、热更新的原理

Webpack热更新的原理是什么

热更新的各部分介绍:

Webpack Dev Server:

  • Bundle Server:提供浏览器可以访问文件的服务器。
  • HMR Server:将热更新打包之后的文件交给HMR Runtime。
  • Webpack Compiler:将js文件编译成bundle.js。

Browser:

  • HMR Runtime:被注入到bundle.js,更新文件的文件。

  • bundle.js:打包之后的文件。

热更新的过程:

启动过程:

  • 启动项目时,webpack会将文件交给Webpack Compiler进行打包。
  • Webpack Compiler打包之后,将文件传输给Bundle Server服务器。
  • 此时浏览器就可以访问到文件了。

更新过程:

  • 代码更新保存之后,发送给Webpack Compiler进行编译。
  • 编译好之后,发送给HMR Server。
  • HMR Server通知HMR Runtime哪些文件的哪些代码进行了更改,并将更新后的代码发送给HMR Runtime。
  • HMR Runtime进行局部刷新。