当前位置: 首页 > article >正文

前端开发之代理模式

介绍 

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

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: RealImg

  constructor(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.kler.cn/news/323017.html

相关文章:

  • Cilium + ebpf 系列文章- (六)Cilium-BGP与分发-EXTERNAL-IP
  • vue3中< keep-alive >页面实现缓存及遇到的问题
  • 【深度学习】深度学习框架有哪些及其优劣势介绍
  • 【CSS】透明度 、过渡 、动画 、渐变
  • JAVAEE如何实现网页(jsp)间的数据传输?一文总结
  • 2024 icpc 第二场网络赛题解
  • vue-cli,element-plus,axios,proxy
  • 31 变量的访问方式(直接和间接),内存地址(32 位和 64 位),指针的概念与定义,取址与取值运算符( 与 *)
  • Spark Streaming 容错机制详解
  • 【Docker】如何让docker容器正常使用nvidia显卡
  • 处理execl表格的库----openpyxl
  • C++ 文件I/O流
  • 【SpringBoot详细教程】-03-整合Junit【持续更新】
  • 代码随想录Day 57|prim算法和kruskal算法精讲,题目:寻宝
  • 提升效率的秘密武器选择指南
  • PTH原理 补丁+工具
  • Java项目——苍穹外卖总结
  • Linux usb hub阅读
  • 【学习】电脑上有多个GPU,命令行指定GPU进行训练。
  • C语言习题~day33
  • 【Unity保龄球项目】的实现逻辑以及代码解释
  • Python Daphne库:ASGI服务的高效Web服务器
  • 使用FFmpeg压缩MP3格式音频
  • 利用模糊综合评价法进行数值评分计算——代码实现
  • 基于Java开发的(控制台)模拟的多用户多级目录的文件系统
  • Redis的主要特点及运用场景
  • 【Linux】ubuntu 16.04 搭建jdk 11 环境(亲测可用)
  • 数据结构:特殊矩阵 及其存储
  • 策略路由控制选路
  • apt update时出现证书相关问题,可以关闭apt验证