/article/webpack-dev-middleware 前言 Webpack 的使用目前已经是前端开发工程师必备技能之一。 devServer 配置的本质是 webpack-dev-server 这个包提供的功能,而 webpack-dev-middleware 则是这个包的底层依赖。 截至本文发表前,webpack-dev-middleware 的最新版本为 webpack-dev-middleware@3.7.2,本文的源码来自于此版本。 本文会讲解 webpack-dev-middleware 的核心模块实现,相信大家把这篇文章看完,再去阅读源码,会容易理解很多。 webpack-dev-middleware 是什么? 上文的源码解读主要分析的是 webpack-dev-middleware 它是如何实现它所拥有的特性、如何处理用户的请求等主要功能点,未包括其他分支逻辑处理、容错。
devServer 配置的本质是 webpack-dev-server 这个包提供的功能,而 webpack-dev-middleware 则是这个包的底层依赖。 截至本文发表前,webpack-dev-middleware 的最新版本为 webpack-dev-middleware@3.7.2,本文的源码来自于此版本。 本文会讲解 webpack-dev-middleware 的核心模块实现,相信大家把这篇文章看完,再去阅读源码,会容易理解很多。 webpack-dev-middleware 是什么? 要回答这个问题,我们先来看看如何使用这个包: const wdm = require('webpack-dev-middleware'); const express = require('express 上文的源码解读主要分析的是 webpack-dev-middleware 它是如何实现它所拥有的特性、如何处理用户的请求等主要功能点,未包括其他分支逻辑处理、容错。
项目的打包主要通过 server.js 文件 webpack-dev-middleware webpack dev server 是一个开发服务器,內建 webpack 使用的 live reloading 安装webpack-dev-middleware npm i webpack-dev-middleware --save-dev 配置webpack-dev-middleware 这里我直接粘贴了 server.js 的代码 const Webpack = require('webpack'); const WebpackDevMiddleware = require('webpack-dev-middleware 而打成这像功能,就是我们配置的webpack-dev-middleware。
使用 webpack-dev-middleware 其实,早起的一些项目中,大家肯能会看见并没有使用 devServer 这个配置项来开启配置服务器,而是开发者新增一个 server.js 文件来实现这个服务器 这是由于早期 devServer 的功能还不稳定,配置项也不丰富,但是现在大部分情况下这个配置已经可以满足了,如果大家想要定制化服务器,也可以手撸一个并借助webpack-dev-middleware webpack-dev-middleware 是一个容器(wrapper),它可以把 webpack 处理后的文件传递给一个服务器(server)。 首先,安装 express 和 webpack-dev-middleware:: npm i -D express webpack-dev-middleware 在 webpack.config.js /webpack.config.js'); const compiler = webpack(config); // Tell express to use the webpack-dev-middleware
之间的交互,webpack-dev-middleware 调用 webpack 暴露的 API对代码变化进行监控,并且告诉 webpack,将代码打包到内存中。 webpack通过watch可以监听文件编译完成和监听文件的变化,webpack-dev-middleware可以调用webpack的API监听代码的变化,webpack-dev-middleware利用 webpack-dev-middleware利用sockjs和webpack-dev-server/client建立webSocket长连接。将webpack的编译编译打包的各个阶段告诉浏览器端。 思考:通过查看 webpack-dev-server 的 package.json 文件,我们知道其依赖于 webpack-dev-middleware 库,那么 webpack-dev-middleware webpack通过watch可以监测代码的变化;webpack-dev-middleware可以调用webpack暴露的API检测代码变化,并且告诉webpack将代码保存到内存中;webpack-dev-middleware
接下来再打开 package.json 文件,看看有哪些 dependency,一个个捋过去之后,与我们的问题强相关的依赖有: express:应用不用多介绍了吧 webpack-dev-middleware 注册了 webpack-dev-middleware,从名字就可以看出这个中间件跟 webpack-dev-server 应该关系匪浅,那就继续打开 webpack-dev-middleware 看看里面的代码 比较幸运,publicPath 关键字出现的频率还是比较少的: webpack-dev-middleware/lib/middleware.js 文件中被使用了 1 次 webpack-dev-middleware 中间件中 webpack-dev-middleware 中间件内部呢,又继续调用 webpack-dev-middleware/lib/util.js 文件的 getFilenameFromUrl 方法 getFilenameFromUrl 内部判断 url.indexOf(publicPath) 若 getFilenameFromUrl 返回 false 则 webpack-dev-middleware
接下来再打开 package.json 文件,看看有哪些 dependency,一个个捋过去之后,与我们的问题强相关的依赖有: express:应用不用多介绍了吧 webpack-dev-middleware 继续往上,看看 setupMiddleware 函数: 注册了 webpack-dev-middleware,从名字就可以看出这个中间件跟 webpack-dev-server 应该关系匪浅,那就继续打开 webpack-dev-middleware 看看里面的代码: 我去。。。 中间件中 webpack-dev-middleware 中间件内部呢,又继续调用 webpack-dev-middleware/lib/util.js 文件的 getFilenameFromUrl 方法 getFilenameFromUrl 内部判断 url.indexOf(publicPath) 若 getFilenameFromUrl 返回 false 则 webpack-dev-middleware
热更新流程 [01.jpg] 2.1 webpack-dev-server & contentBase 启动一个 Express Server,整合 webpack-dev-middleware 中间件 在 webpack-dev-middleware 中,使用了 memory-fs 内存文件系统模块,替换 Webpack 的 Compiler 对象的输出打包结果文件模块 outputFileSystem // webpack-dev-middleware/lib/fs.js const MemoryFileSystem = require('memory-fs'); module.exports = = fileSystem; } }; 2.2 watch 上图共有三个 watch: step1 中的 watch 监控依赖模块的文件变化,即代码修改触发重新编译(HMR); step2 是 webpack-dev-middleware
之间的交互,webpack-dev-middleware 调用 webpack 暴露的 API对代码变化进行监控,并且告诉 webpack,将代码打包到内存中。 webpack通过watch可以监听文件编译完成和监听文件的变化,webpack-dev-middleware可以调用webpack的API监听代码的变化,webpack-dev-middleware利用 webpack-dev-middleware利用sockjs和webpack-dev-server/client建立webSocket长连接。将webpack的编译编译打包的各个阶段告诉浏览器端。 思考:通过查看 webpack-dev-server 的 package.json 文件,我们知道其依赖于 webpack-dev-middleware 库,那么 webpack-dev-middleware webpack通过watch可以监测代码的变化;webpack-dev-middleware可以调用webpack暴露的API检测代码变化,并且告诉webpack将代码保存到内存中;webpack-dev-middleware
本次探索依赖公司前端 Vue 项目开发脚手架配置:Webpack + Webpack-Dev-Middleware + Webpack-Hot-Middleware + Express。 这就要看 Webpack-dev-middleware了。 Webpack-dev-middleware 和 Express 服务器)。 上面有说到编译之后的文件会被写入到内存,而 Webpack-dev-middleware 插件通过 memory-fs 实现静态资源请求直接访问内存文件。 }); 上面代码可以看到,Webpack 编译打包之后得到一个 Compilation ,并将 Compilation 传递到 Webpack-dev-middleware 插件中,Webpack-dev-middleware
webpack's Watch Mode webpack-dev-server webpack-dev-middleware 2、Watch模式 watch模式其实很简单,就是在package.json 3、webpack-dev-middleware webpack-dev-middleware就是是一个中间件,用处就是可以把webpack打包后的文件传递给一个我们自建的服务器。
Webpack-hot-middleware :结合 Webpack-dev-middleware 使用的中间件,它可以实现浏览器的无刷新更新,也就是 HMR; [face1.gif] 下面一起学习 HMR ,在 Webpack-dev-middleware 中通过调用 startWatch() 方法对文件系统进行 watch: // webpack-dev-server\bin\webpack-dev-server.js 2.保存编译结果 Webpack 与 Webpack-dev-middleware 交互,Webpack-dev-middleware 调用 Webpack 的 API 对代码变化进行监控,并通知 Webpack Webpack 能将代码保存到内存中,需要归功于 Webpack-dev-middleware 的 memory-fs 依赖库,它将原本 outputFileSystem 替换成了 MemoryFileSystem 其中部分源码如下: // webpack-dev-middleware\lib\Shared.js Line 108 // store our files in memory var fs; var
Webpack-hot-middleware :结合 Webpack-dev-middleware 使用的中间件,它可以实现浏览器的无刷新更新,也就是 HMR; ? ,在 Webpack-dev-middleware 中通过调用 startWatch() 方法对文件系统进行 watch: // webpack-dev-server\bin\webpack-dev-server.js 2.保存编译结果 Webpack 与 Webpack-dev-middleware 交互,Webpack-dev-middleware 调用 Webpack 的 API 对代码变化进行监控,并通知 Webpack Webpack 能将代码保存到内存中,需要归功于 Webpack-dev-middleware 的 memory-fs 依赖库,它将原本 outputFileSystem 替换成了 MemoryFileSystem 其中部分源码如下: // webpack-dev-middleware\lib\Shared.js Line 108 // store our files in memory var fs; var
angular-cli创建ng项目通过@ngtools/webpack已经内置了webpack 相比location.reload() 更新方式,不需要刷新页面,可以保存应用的当前状态 HMR相关的中间件 webpack-dev-middleware webpack-dev-middleware 是一个 express 中间件,核心实现两个功能:第一通过file-loader内部集成了node的 monery-fs/memfs 内部文件系统,,直接将资源存储在内存 webpack-dev-server 内置了webpack-dev-middleware和express服务器,利用webpack-dev-middleware提供文件的监听和编译,利用express提供
而我们请求刚好有添加了api前缀,这个时候可通过上面配置实现在请求的时候将api前缀去掉 方法三 不使用代理来处理,在服务端中启动webpack,端口用服务端端口,端口一致就没有了跨域问题 cnpm i webpack-dev-middleware express'); let server = express(); let webpack = require('webpack'); //中间件 let middleware = require('webpack-dev-middleware
我们一般用webpack-dev-server启动一个开发服务,webpack内部实现watch,文件发生修改就重新打包编译保存在内存中,webpack-dev-server依赖中间件webpack-dev-middleware 浏览器和服务端是通过websocket进行长连接,webpack内部实现的watch就会监听文件修改,只要有修改就webpack会重新打包编译到内存中,然后webpack-dev-server依赖中间件webpack-dev-middleware
devServer 推送更新消息到浏览器 浏览器接收到服务端消息做出响应 对模块进行热更新或刷新页面 watch 编译过程、devServer 推送更新消息到浏览器 webpack-dev-server 里引用了 webpack-dev-middleware Object.assign({}, this.options, { logLevel: this.log.options.level }) ); } // webpack-dev-middleware compiler.watch(options.watchOptions, (err) => { ... }); } 以上代码可以看出,webpack-dev-middleware // webpack-dev-middleware/lib/fs.js fileSystem = fs; } else if (isMemoryFs) {
4.2.1 webpack-dev-middleware webpack-dev-server是官方提供的用于搭建本地开发环境的一个微型Node.js服务框架,并且提供动态编译、HMR(热更新)等功能。 webpack-dev-middleware是Express框架的一个中间件,结合一些必要的功能模块可以实现动态编译以及热更新等功能。 webpack-dev-middleware将webpack构建输出的文件存储在内存中。正常情况下,webpack构建产出的文件会存储在output配置项指定的硬盘目录中。 webpack-dev-middleware在此基础上建立了一个文件映射机制,每当匹配到一个webpack构建产出文件的请求后便会将内存中与其对应的数据返回给发起请求的客户端。 实际上,webpack-dev-server就是在Express和webpack-dev-middleware基础上进行的封装。
通过live-server或者直接通过浏览器打开html文件,查看效果 为了完成自动编译,webpack提供了几种可选的方式 Webpack watch mode Webpack-dev-server Webpack-dev-middleware Webpack Dev Middleware webpack-dev-middleware是一个封装器,它可以把webpack处理过的文件发送到一个server webpack-dev-server在内部使用了它 ,然而它也可以作为一个单独的package来使用,以便根据需求进行更多自定义配置 搭配一个服务器来使用它,比如express. npm install --save express webpack-dev-middleware express = require("express") const webpack = require("webpack") const webpackDevMiddleware = require("webpack-dev-middleware
设置 webpack-dev-middleware,用于处理对静态资源的处理,后面解析 this.setupDevMiddleware(); // 6. 实例化 express 服务器,添加 webpack-dev-middleware 中间件用于处理静态资源的请求,然后初始化 HTTP 服务器。 这部分暂时被我们略过了,这部分就是 webpack-dev-middleware 处理的内容了。 // webpack-dev-middleware/lib/middleware.js module.exports = function wrapper(context) { return function 总结 最后总结一下,webpack-dev-server 可以作为命令行工具使用,核心模块依赖是 webpack 和 webpack-dev-middleware。