Webpack DevServerExpress 中间件

news2024/12/23 14:28:07

前言

webpack-dev-server 底层是 express + webpack-dev-middleware

express是基础。
webpack-dev-middleware是中间件,以监听模式启动 webpack,将编译后的文件输出到内存(使用fs-memory),沟通webpackHRM(热替换 Hot Module Replacement)API便于本地开发的实时更新。

以伪代码来看,大致上是这么一个过程。

const express = require('express');
const webpackDevMiddleware= require('webpack-dev-middleware');
const app = express();
const devServer = app.use( webpackDevMiddleware(config) )

看到这个过程,我们很自然的想到,我们是不是可以给express加上更多中间件,来升级整个Webpack DevServer的能力呢?

Webpack devServer提供了这个注册第三方中间件的入口。

注册中间件

官方文档:

webpack.docschina.org/configuration/dev-server/#devserversetupmiddlewares
www.expressjs.com.cn/guide/using-middleware.html

截止今天(2022.10.31),最新版本webpack-dev-server@4.11.1
官方还兼容2个老的接口。
devServer.onAfterSetupMiddleware
devServer.onBeforeSetupMiddleware
不过已经depreciated了。

推荐以后采用devServer.setupMiddlewares

看官方示例:

module.exports = {
  // ...
  devServer: {
    setupMiddlewares: (middlewares, devServer) => {
      if (!devServer) {
        throw new Error('webpack-dev-server is not defined');
      }

      devServer.app.get('/setup-middleware/some/path', (_, response) => {
        response.send('setup-middlewares option GET');
      });

      // 如果你想在所有其他中间件之前运行一个中间件或者当你从 `onBeforeSetupMiddleware` 配置项迁移时,
      // 可以使用 `unshift` 方法
      middlewares.unshift({
        name: 'first-in-array',
        // `path` 是可选的
        path: '/foo/path',
        middleware: (req, res) => {
          res.send('Foo!');
        },
      });

      // 如果你想在所有其他中间件之后运行一个中间件或者当你从 `onAfterSetupMiddleware` 配置项迁移时,
      // 可以使用 `push` 方法
      middlewares.push({
        name: 'hello-world-test-one',
        // `path` 是可选的
        path: '/foo/bar',
        middleware: (req, res) => {
          res.send('Foo Bar!');
        },
      });

      middlewares.push((req, res) => {
        res.send('Hello World!');
      });

      return middlewares;
    },
  },
};

上面这个示例,我们在配置文件中,为setupMiddlewares字段设置了一个function类型的值。
实际调用的是node_modules/webpack-dev-server/lib/Server.js 中 Server类下的成员函数 setupMiddlewares()
在这里插入图片描述
这个函数中,如果检测到传入的配置字段是function类型,就会把内部的middlewares数组和自身的server实例传进去。
返回值是新的middlewares数组。
所以我们在配置文件config.js中用到的签名是 setupMiddlewares: (middlewares, devServer) => {}
下一段就会middlewares.foreach,使用(this.app).use进行真正的注册。

setupMiddlewares支持几种方式注册中间件。

2.1 支持直接操作middlewares数组。

数组元素支持

  • (req,res)=>{} Function格式
  • {path:'', name:'', middleware:(req,res)=>{} } Object格式
const mymiddleware = require('path/to/mymiddleware');
setupMiddlewares: (middlewares, devServer) => { 
	//函数形式
    middlewares.push((req,res)=>{}); // push 最后注册
    middlewares.unshift((req,res)=>{}); // unshift最先注册
    return middlewares; // setupMiddlewares必须返回middlewares数组
}

setupMiddlewares: (middlewares, devServer) => { 
	//对象形式
    middlewares.push({path:'/api',middleware:mymiddleware }); // push 最后注册
    middlewares.unshift({path:'/api',middleware:mymiddleware }); // unshift最先注册
    return middlewares; // setupMiddlewares必须返回middlewares数组
}

2.2 直接操作app注册

const mymiddleware = (req,res)=>{};
setupMiddlewares: (middlewares, devServer) => { 
     // 操作express app注册
     const app = devServer.app;
     app.use(mymiddleware);
     // 或者直接写
     devServer.app.use(mymiddleware);
     // 操作app的形式也支持注册到path
     devServer.app.use('/api',mymiddleware);
     devServer.app.get('/api',mymiddleware);
     return middlewares; // setupMiddlewares必须返回middlewares数组
    }

需要注意的是,app.use( ‘somepath’, middleware )的方式,
和直接app.use(middleware ) 的区别在于,

首先,前者只会在路径匹配到 ‘somepath’ 的时候才执行后面的middleware。
而后者的path默认是 ‘/’ ,所以会对所有请求都依次应用middlewares数组。

其次,前者注册的path会成为baseUrl, 可以在middleware中 通过req.baseUrl获得。
举例, 访问 '/api/aa/bb’时。

const mymiddleware = (req,res)=>{
	console.log('baseUrl:', req.baseUrl); 
	console.log('path:', req.path); 
};
app.use('/api',mymiddleware);  // 会打印 baseUrl: /api,  path: /aa/bb
app.use(mymiddleware); // 会打印 baseUrl: /,  path: /api/aa/bb

Express middleware写法

上一节我们知道了,写出来一个middleware之后怎么注册。
这一节讲一下,怎么写一个express middleware。

https://www.expressjs.com.cn/4x/api.html#req

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习之特征提取

Question Orientied:来自论文的一个学习点 Feature extraction 定义: 特征提取是指使用计算机提取图像中属于特征性的信息的方法及过程。 简言之 提取图像关键信息。 特征提取出来的结果叫特征向量。 进入主题之前 普及几个常识: 像素的英文名称:Pixe…

Flutter 完全手册

小册介绍 Flutter 作为一个跨平台的框架,其开发技术栈融合了 Native 和前端的技术,不仅涉及到了 Native(Android、iOS )的开发知识,又吸取了很多前端(例如 React)的技术理念和框架,并…

甘露糖-聚乙二醇-CY3 Cy3-PEG-mannose

甘露糖-聚乙二醇-CY3 Cy3-PEG-mannose 中文名称:甘露糖-荧光染料CY3 英文名称:mannose-Cyanine3 别称:CY3标记甘露糖,CY3-甘露糖 溶解性:溶于大部分有机溶剂,如:DCM、DMF、DMSO、THF等等。在…

业务数据分析-Excel数据透视表(四)

目录 1、什么是数据透视表 2、如何操作 3、数据透视表的优势 4、适用什么场景 5、使用前注意事项 1、什么是数据透视表 先来举个例子 看下面这段对话 下午5点30 boss:把这张表给我整理成如下格式,就是根据平台给我汇总一下销量和收入&#xff0c…

机械工程基础笔记整理

第一章 绪论 第一节 课程的特点 1. 综合性 本课结合了工程力学,机械工程材料,常用机构,支撑零部件,机械传动,液压传动,气压传动的相关知识。 2. 基础性 无论从事机械制造,还是使用研究机械&…

OpenCV图像处理——(实战)答题卡识别试卷

总目录 图像处理总目录←点击这里 二十、答题卡识别试卷 20.1、预处理 灰度图 输出灰度图高斯滤波去噪 gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred cv2.GaussianBlur(gray, (5, 5), 0)边缘检测 edged cv2.Canny(blurred, 75, 200)20.2、轮廓检测 找到原…

快速构建一个简单的对话+问答AI (上)

文章目录前言part0 资源准备基本功能语料停用词问答闲聊语料获取part01句的表达表达one-hot编码词嵌入大致原理实现简单版复杂版如何训练转换后的形状part02 循环神经网络RNNRNN投影图RNN是三维立体的LSTM&GRUpart03意图识别分词FastText分类FastText网络结构优化点构造Fas…

http请求走私漏洞原理,利用,检测,防护

目录 什么是请求走私 漏洞成因与常见类型 Keep-Alive&Pipeline CL&TE 常见走私类型 1.CL不为0 2.CL CL 3.CL TE 4.TE CL 5.TE TE 走私攻击应用实例(漏洞利用) 使用CL TE走私获取其他用户的请求、Cookie 2.泄露请求头重写请求实现未…

UE4贴图自适应屏幕大小

游戏开发中,不同屏幕下的分辨率不同,模型/物品被拉伸之后贴图也会随之拉伸。 如果需要在不同屏幕下面实现贴图真实大小不变(以下简称为自适应),需要对UV进行缩放处理之后再取得对应贴图的颜色。 本文提供一种能够实现不…

为什么国外程序员的创造力比中国程序员强?

1川口耕介是个日本程序员,他曾在Sun公司从事Java、XML和Solaris相关的开发。2004年,他用Java写了叫做一个Hudson的开源工具,专门做持续集成(CI)。Hudson安装、配置、使用都非常方便,并且支持用插件的形式扩…

有求必应 | 听说这个管线排布,横竖都行?

大家好,今天还是被 yi 情反复拿捏的建模助手。 拿捏归拿捏,企微客服还是很认真得在给大家答疑解惑记bug,刚好有求知若渴的盆友问到管线排布这个角度,是否能有小数点,比如1.2,或者0.8。 对待此类问题&#x…

无线传感器网络:排队论(Queueing Theory)模型

文章目录The arrival ProcessQueueing SystemThe M/M/1 queueThe M/M/1/N queueReferences排队理论已被用于评估通信网络的性能很多年了。早在1917年,丹麦数学家 Erlang 就将该理论用于电话交换机的设计,并开创了现在著名的 Erlang-B 和 Erlang-C 公式&a…

DevData Talks | 知乎艾辉:从工具建设到运营,千人团队研发提效最佳实践

在千人级别的组织层级提升研发效能,是一种什么体验?可以确定的是,千人级组织的效能提升,并不是百人级团队的等比放大。 在数十人乃至小百人的团队,统一规范研发工具与流程的门槛相对较低,参与方也比较简单…

07 索引

1.索引 概述 1. 简介 索引是一种帮助数据库高效获取数据的数据结构;通过索引可以快速获取到符合条件的数据的内存地址,避免全表扫描 2. 索引的优缺点 优点: 可以快速地检索数据,降低数据IO成本通过索引可以对数据进行排序&…

jenkins 共用宿主机中的docker自动化部署

目录 第一节 jenkins 共用宿主机中的docker自动化部署 1.docker命令安装启动jenkins 2.查询jenkins内是否可以执行宿主机中的docker 第二节.jenkins 配置自动化部署 1.界面配置 1.配置mave 2.配置gitee 第三节 创建springboot多模块项目 1.相关配置 1.pom 2.编写docke…

【面试题】作用域和闭包

1. 作用域 作用域是指变量的合法使用范围。 例如下图中,函数fn3内定义的变量a3,无法在函数fn3以外的区域使用。 作用域分为全局作用域,函数作用域,块级作用域(ES6新增) 全局作用域:变量没有受…

HTML+CSS+JS个人网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

MYSQL索引数据结构----B+树

索引数据结构的考量 我们在考虑数据结构的时候,应该首先要知道数据存放在哪里? 而MYSQL的数据是持久化的,所以其数据(数据记录索引)应该是保存在磁盘里面的。因此当我们要查询某条数据记录时,就会先从磁盘…

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xff…

一文理解Linux的基本指令(三分钟学会Linux基本指令)

前沿: 本文小马将把Linux一般比较常见的指令给大家一一列举出来,为了大家忘记某些指令后,可以方便查询记忆,再次小马建议,Linux指令并不需要去特别花时间专门记忆,只需要多进行操作实现就行! &a…