前端开发之代理模式

server/2024/10/19 17:27:05/

介绍 

代理模式是一种结构型设计模式,它通过为一个对象提供一个代理对象来控制对该对象的访问。代理对象可以在访问真实对象之前或之后添加一些额外的操作。

class RealImg {fileName: string;constructor(fileName: string) {this.fileName = fileName;}disPlay() {this.loadFromDist()console.log("disPlay:", this.fileName)}private loadFromDist(){console.log("loading:", this.fileName)}
}class ProxyImg{realImg: RealImgconstructor(fileName: string) {this.realImg = new RealImg(fileName)}display(){this.realImg.disPlay()}
}
const proxyImg = new ProxyImg('xxx.png')
proxyImg.display()
// loading: xxx.png
// disPlay: xxx.png

符合设计原则:

  • 代理和目标分离,解耦
  • 代理可自行扩展
  • 目标也可自行扩展

 场景

(1)DOM事件代理(委托)

事件绑定到父容器上,而非目标节点。适合目标较多或者数量不确定(入无限加载的瀑布流图片列表)

<div id="container"><a href="#">a1</a><a href="#">a2</a><a href="#">a3</a><a href="#">a4</a>
</div>const container = document.getElementById("container");
if (container) {// DOM 事件代理(委托)container.addEventListener("click", (event) => {const target = event.target as Element;if (target.nodeName === "A") {alert(target.innerHTML);}});
}

(2)webpack devServer proxy

正向代理(客户端代理)。开发环境,前端请求服务器 API,代理本地服务器,或者 mock 接口。

编辑vite.config.ts

server: {port: 3000,proxy: {"/api": {target: "http://localhost:8888",/** 是否启用websockets */ws: true,/** 是否允许跨域 */changeOrigin: true}},
}

编辑 index.ts

<script lang="ts" setup>
import { onMounted } from "vue";
import axios from "axios";onMounted(() => {document.getElementById("btn1")?.addEventListener("click", () => {axios.get("/api/getInfo").then((res) => {console.log("res", res);});});
});
</script>
<template><div id="container"><button id="btn1">发送请求</button></div>
</template>

编辑服务 server.js 文件,执行 node server.js

import http from "http";
http.createServer(function (req, res) {if (req.url === "/api/getInfo") {res.end("info");} else {res.end("hello");}}).listen(8888);

启动前端服务后,访问 http://localhost:3000 点击“发送请求”

 (3)Nginx 反向代理(服务端代理)

1. 将上述 vite+typescript 前端项目打包成 dist(vite.config.ts 配置 base: "dist"),放入nginx的 www 目录。

2. 配置nginx

server {listen       8080;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}location /api {proxy_pass http://127.0.0.1:8888;}
}

3. 启动 nginx

> brew services start nginx 
==> Successfully started `nginx` (label: homebrew.mxcl.nginx)

4. 控制台执行 node server.js,启动上述 server.js 文件。

5. 页面访问 http://localhost:8080/dist

 


http://www.ppmy.cn/server/123373.html

相关文章

Eureka注册中心如何实现集群

Eureka 注册中心实现集群&#xff0c;主要是通过配置多个Eureka服务器的地址&#xff0c;让它们互相注册&#xff0c;从而形成一个集群。 步骤如下&#xff1a; 1&#xff0c;启动多个Eureka服务器实例。 2&#xff0c;配置每个Eureka服务器实例的application.properties或a…

Vue2配置环境变量的注意事项

在实际开发中时常会遇到需要开发环境与生产环境中一些参数的替换,为了方便线上线下环境变量切换可以利用node中的process进行环境变量管理 实现步骤如下: 1.在 根目录 新增环境文件 .env.development 和 .env.production 注意文件名称保持一致( 需要强调的是文件中的变量名切…

Linux三剑客对数据处理

grep配合正则表达式可以灵活的查找文本内容。 但是有些时候我们不仅仅需要找出数据&#xff0c;还需要按照一定的规则进行整合&#xff0c;格式化排列 文本文件内有一百条规范数据&#xff0c;如下&#xff1a; John Doe, 25, Engineer Alice Smith, 30, Data Scientist Bob …

机器人控制器设计与编程基础实验高效版本-ESP32等单片机实验报告

只需要课程大纲或进度表wokwi 大模型工具&#xff0c;就可以完全掌握嵌入式系统基础实验的所有核心点。 LCD // Learn about the ESP32 WiFi simulation in // https://docs.wokwi.com/guides/esp32-wifi https://wokwi.com/projects/321525495180034642#include <WiFi.h>…

《解锁高效流程设计:深度剖析责任链模式与实战应用》

《解锁高效流程设计&#xff1a;深度剖析责任链模式与实战应用》 责任链模式 是一种行为设计模式&#xff0c;它允许多个对象来处理请求&#xff0c;而不预先指定具体的处理者。多个处理对象被连接成一条链&#xff0c;沿着这条链传递请求&#xff0c;直到某个处理对象决定处理…

【文件增量备份系统】MySQL百万量级数据量分页查询性能优化

&#x1f3af; 导读&#xff1a;本文针对大数据量下的分页查询性能问题进行了深入探讨与优化&#xff0c;最初查询耗时长达12秒&#xff0c;通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟&#xff0c;采用先查询倒数第N条记录…

每日学习一个数据结构-DAG有向无环图

文章目录 有向无环图的特性使用场景 有向无环图&#xff08;Directed Acyclic Graph&#xff0c;简称DAG&#xff09; 是一种特殊的图结构&#xff0c;在数学和计算机科学领域有广泛应用。它由顶点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&…

Java线程基础

线程 1.什么是程序? 是为了完成特定任务,用某种语言编写的一组指令的集合 进程 1.进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存空间。当我们使用迅雷&#xff0c;又启动了一个进程&#xff0c;操…