手写一个简易webpack-dev-server+热更新

775 阅读2分钟

首先你需要对webpack如何生成bundle.js文件做一定的了解

1 启动server访问index.html

  1. 首先devserver 看名字就知道这玩意是一个开发用服务器 所以我们需要一个后端服务(这里使用koa)
  2. 我们需要在80端口访问我们打包好的html文件 这里使用koa-static 将index.html托管到服务器
  3. 这样一来 启动服务并访问8080即可打开我们写好的项目
const Koa = require('koa');
const serve = require("koa-static")

const app = new Koa();
app.use(serve("/***/dist", { extensions: ["html"] })) //托管dist下的html文件

app.listen(8080, () => {
        console.log('dev-server启动在8080端口');
        bundle()   // 执行bundle
})

2 监听文件变化并重新打包

光能访问还不够 我们每次保存js文件 都需要重新执行一次打包 自动更新项目

  1. 使用node的fs.watch方法 监听src下所有文件的变化
 // watch.js
const fs = require('fs')

fs.watch(
				 '/***/***/src',  // 需要监控的文件夹绝对路径
				{ recursive: true }, // 配置 监控子文件
	       callback // 文件发生变化时执行的回调
)

const callback = (event,filename)=>{
  console.log(`${filename}文件发生变化`)
}

3 将打包好的代码推送给浏览器执行

  1. bundle()方法生成打包好的bundle代码(也就是bundle.js中的代码)
  2. 每次更新 重新生成一份bundle代码并交给浏览器执行
  3. 使用websocket进行通信 因为http需要客户端发起请求才能通信 而websocket可以由服务端发起请求 主动向客户端发送数据
function hotUpdate(webpackConfig) {
    //TODO 创建WebSocketServer到3001端口
    const ws = new WebSocket.Server({ port: 3001 });

    //! 监听前后端链接事件 
    ws.on('connection', function (connection) {
        console.log('websocket连接成功,热更新准备就绪')
				// 生成bundle代码发送给浏览器
        const callback= () => {
            const newBundleCode = bundle()
            connection.send(newBundleCode); 
        }
				// 监听到src目录下文件变化  执行回调 发送新代码给浏览器
		    fs.watch('/***/***/src',{ recursive: true },callback)
       
    });
}
  1. 在浏览器端需要接收这些代码并重新执行 (使用eval执行)
		var ws = new WebSocket("ws://localhost:3001/");
    //监听建立连接
    ws.onopen = function (res) {
        console.warn('websocket连接成功');
    }
    //监听服务端发来的消息
    ws.onmessage = function (res) {
        eval(res.data)  // 使用eval执行新bundle的代码
    }

至此就实现了一个建议的webpack-devServer的热更新

这里只做一个简单的思路整理 具体webpack还做了很多东西 建议查看大佬的文章

blog.csdn.net/chern1992/a…

基本思路就是监控src下文件变化 重新生成代码 并通过websocket交给浏览器执行

实际中 webpack并不会重新执行所有代码 而是只替换发生变化的模块代码

并且devserver的bundle.js文件是先保存到内存中 再与服务器端做通信

详情可见memory-fs库