前端开发环境与真实环境的接口联通的那些最佳实践

1. 背景

前端开发的产物通常是 app.jsapp.css ,然后将这些资源放在真实环境域名下进行工作的。
但前端的开发环境通常是本地的 http://localhost:xxx,业务域名可能是 https://xxx.abc.com,两者不在一个域名下在调用接口或者调试时会非常不方便。

加上现在的构建或脚手架工具,如 Vite、Webpack5、Umi 等在开发环境下采用 ES Module 构建,线上采用单文件构建,导致传统的,访问业务域名,然后将资源代理到本地的方式出现问题,所以更合适的方式应该是如何在前端的本地环境下,可以流畅的访问业务域名下的接口。

期待:

2. 实现思路

实现这种方法主要解决:CORS 问题,及 Same-site Cookies 的问题(非登陆态场景不需要解决 Cookie 问题,但很少见此类场景)。
这两个问题,通常业务侧是不能给解决的,所以需要前端自行处理这两个问题。

3. 实现方法

下面罗列下实现期望中,在本地开发环境,顺畅调用业务接口的方法。

3.1 系统级代理实现

针对 CORS 及 Same-site 处理,浏览器级代理是完全无法处理的,当然从调用方向来看也是不合适的,所以需要系统级代理进行拦截重写。

这里推荐 Whistle 或者 Charless 实现。

如 Whistle 可以使用:

pattern resCors://* reqCookies://filepath

缺点:

  • 系统级代理,全局受影响,影响网络速度及系统性能。
  • session 的 cookie 需要定期更新,非常繁琐。
  • 部分代理工具无法转发拦截本地请求。

3.2 前端工程侧代理

这个属于比较成熟的方案了,内部通过配置 proxy 可以实现应用及的代理转发。

3.2.1 Webpack OR Umi

Webpack 和 Umi 采用相似的代理方案,底层使用 http-proxy-middleware 实现,可以很方便修改请求和响应,实现 CORS 及 Same-site 的处理。

可以在 webpack.config.js 或者 Umi 的 config.js 中配置:

export default {
  {
    '/api/': {
      target: "https://xxx.abc.com",
      changeOrigin: true,
      secure:false,
      onProxyReq: (proxyReq) => {
        proxyReq.setHeader(
          'Cookie',
          'sessionId=wzqa6tjqgl;sessionId2=wzqa6tjqgl',
        )
      },
    },
  }
}
3.2.2 Vite

Vite 底层通过 node-http-proxy 实现代理功能。

可以在 vite.config.js 进行配置:

export default {
  server: {
    proxy: {
      "/api": {
        target: "https://xxx.abc.com",
        changeOrigin: true,
      },
    },
  },
  plugins: [
    {
      name: "append-backend-cookies",
      configureServer(server) {
        server.middlewares.use((req, res, next) => {
          req.headers["Cookie"] = "sessionId=wzqa6tjqgl;sessionId2=wzqa6tjqgl";
          next();
        });
      },
    },
  ],
};

优点:

  • 相比系统级,不会对全局系统代理产生影响,系统性能影响小。
  • 不用额外的其他工具软件支持,简单方便。

缺点:

  • session 的 cookie 需要定期更新,非常繁琐。

3.3 完美方案 Electron 修改 Webview

CORS 的问题本质是浏览器的限制,Same-site 导致的登陆 Cookies 无法携带也是浏览器的限制,那直接把浏览器的限制给去掉不就可以迎刃而解了。这样不需要 api 的域名转发了,也不需要代理了,直接在 localhost 下调用 xxx.abc.com 就可以了。且在 Electron 中也可以正常安装浏览器插件,像 React-Devtools 完全正常使用。

早期 Electron 版本只需要 webSecurity: false 就可以解决我们的问题,但在 Chrome 94 版本不再放行,无法再携带 Cookies,也就是 Electron v14 之后的版本无法通过 webSecurity: false 来禁用这些问题。

新版本(v27),通过复写 onHeadersReceived 实现:

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      webSecurity: false,
    },
  });

  win.loadURL("https://localhost:3000");
  // win.webContents.openDevTools();
}

function disableSamesiteCookies(filter = ["*://*/*"]) {
  session.defaultSession.webRequest.onHeadersReceived(
    { urls: filter },
    (details, callback) => {
      const newCookies = [];

      details?.responseHeaders?.["set-cookie"]?.map((item) =>
        newCookies.push(item.split("; ")[0] + "; Secure; SameSite=None")
      );
      details.responseHeaders["set-cookie"] = newCookies;

      callback({ cancel: false, responseHeaders: details.responseHeaders });
    }
  );
}

app.whenReady().then(() => {
  createWindow();
  disableSamesiteCookies();

  //  ……
});

优点:

  • 几乎全是优点。

缺点:

  • 需要额外开启 electron 项目。

4. 链接

  • https://github.com/http-party/node-http-proxy#options
  • https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure?hl=zh-cn
  • https://www.chromium.org/updates/same-site/
  • https://github.com/GoogleChromeLabs/samesite-examples
  • https://releases.electronjs.org/releases/stable?version=14
  • https://github.com/lecepin/Debugging-env-browser
  • https://webpack.js.org/configuration/dev-server/#devserverproxy
  • https://vitejs.dev/config/server-options.html#server-proxy
  • https://github.com/chimurai/http-proxy-middleware#options

原文地址: Github

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NacosSync 用户手册

手册目标 理解 NacosSync 组件启动 NacosSync 服务通过一个简单的例子,演示如何将注册到 Zookeeper 的 Dubbo 客户端迁移到 Nacos。 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范…

变量和引用

变量和引用 2.1.深入认识变量 2.1.1.什么是变量 变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址 变量三要素:名称、类型、值 2.1.2.变量的名称 组成: 字母、数字、下划线组成,不能以数字开头 变量名称的长…

PyLMKit(4):基于本地知识库的检索增强生成RAG

基于本地知识库的检索增强生成RAG 0.项目信息 日期: 2023-12-2作者:小知课题: RAG(Retrieval-Augmented Generation,检索增强生成)是一种利用知识库检索的方法,提供与用户查询相关的内容,从而…

代码随想录day3 203.移除列表元素 707.设计链表 206.反转链表

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。 双链表 单链表中的指针域只能指向节点的下一个节点。 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 双链表 既可以向前查询也可以…

vcomp140.dll是什么意思?vcomp140.dll缺失怎么修复的五个方法

在电脑使用过程中,我们常常会遇到一些错误提示,其中之一就是“由于找不到vcomp140.dll无法继续执行代码”。这个错误提示通常出现在运行某些程序时,给使用者带来了很大的困扰。那么,为什么会出现这个错误呢?又该如何解…

借助ChatGPT帮助程序员解决系统线上问题

对不同的业务以及不同的中间件提问题的方式不同 首先我们在每一种类型的提问前都需要对AI进行定义也就是让AI明白你提问的问题是那个行业的那个技术 定义身份话术 常见的 #接下来的对话你将以一名java高级开发工程师的身份和我聊天 接下来的对话你将以一名XXXX的身份和我聊天提…

关于Typora如何插入自己的云端视频的方法

关于Typora如何插入自己的云端视频的方法 文章目录 关于Typora如何插入自己的云端视频的方法前言:实现步骤:小结 前言: 我本来使用gitee来作为typora的图床,但我现在想要把我自己的视频上传到云端,然后通过超链接在ty…

Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解

目录 D - Tile Pattern 题目大意: 思路: 代码: D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意: 给你一个n和q,n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况,q为查询次数…

java的四种内部类,从0讲清楚

什么是内部类? 为什么要学习内部类? 可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么…

从“芯”到云,看亚马逊云科技如何让未来“平等”发生

文章目录 业界最全面算力选择,有效解决多样性需求多年自研芯片积累,带来性能与性价比双重优势全球基础设施与独特的业务模式,让创新不受限 “科幻作家威廉吉布森说‘未来已至,只是还没有均匀分布’。”2023年6月底,当亚…

【开源存储】minio对象存储部署实践

文章目录 一、前言1、介绍说明2、部署方式3、冗余模式4、约束限制4.1、规格参数4.2、API支持a、minio不支持的Amazon S3 Bucket APIb、minio不支持的Amazon S3 Object API 二、部署说明1、软件安装2、minio单机部署3、minio分布式部署3.1、前置条件3.2、开始运行3.3、操作说明 …

Linux 进程(三)

Linux进程状态的查看: 这是Linux内核源代码对于进程状态的定义: R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。 S睡眠状态(sleeping): 意味着进程在…

ipvlan介绍

最近使用docker,涉及到需要跨多台物理机部署系统,查了好多资料,最后查到了ipvlan。那什么是vlan,什么又是ipvlan。 交换机层面的vlan,是按802.1Q规范,在链路层中加了4字节的标识vlan的数据,交换…

如何在WordPress中批量替换图片路径?

很多站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题。总结一下WordPress图片路径批量替换的过程,方便有此类需求的站长们学习。 什么情况下批量替换图片路径 1、更换了网站域名 有许多网站建设初期…

灯光开不了了,是不是NVIDIA的问题

如果你跟我一样灯光亮度调节不了了,然后显示适配器又没有了,你看一下是不是和我这个大怨种一样把NVIDIA卸了,为了这个东西,这屏幕亮瞎我的眼镜😢😢。只需要进入官网,你就可以直接找到&#xff0…

SSM框架(五):Maven进阶

文章目录 一、分模块开发1.1 分模块开发的意义1.2 步骤 二、依赖管理2.1 依赖传递2.2 可选依赖和排除依赖 三、继承与聚合3.1 聚合3.2 继承3.3 聚合和继承区别 四、属性4.1 pom文件的依赖使用属性4.2 资源文件使用属性 五、多环境开发六、跳过测试七、私服7.1 下载与使用7.2 私…

前端面试灵魂提问(1)

1.自我介绍 2.在实习中,你负责那一模块 3.any与unknow的异同 相同点:any和unkonwn 可以接受任何值 不同点:any会丢掉类型限制,可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查,所以在使用一个…

Redis RDB

基于内存的 Redis, 数据都是存储在内存中的。 那么如果重启的话, 数据就会丢失。 为了解决这个问题, Redis 提供了 2 种数据持久化的方案: RDB 和 AOF。 RDB 是 Redis 默认的持久化方案。当满足一定条件的时候, 会把当前内存中的数据写入磁盘, 生成一个快照文件 dump.rdb。Redi…

各类声音数据集大合集—乐器、车辆、鸟鸣、蜜蜂声音、歌曲、喇叭、人类声音不同等类型的声音数据集

最近收集了一大波关于各类声音的数据集,包含乐器、车辆、鸟鸣、蜜蜂声音、歌曲、喇叭、人类声音不同等类型的声音数据集,废话不多说,给大家逐一介绍!! 1、吉他和弦大调、小调数据集 吉他和弦大调、小调数据集&#x…

Hive数据倾斜之:数据类型不一致导致的笛卡尔积

Hive数据倾斜之:数据类型不一致导致的笛卡尔积 目录 Hive数据倾斜之:数据类型不一致导致的笛卡尔积一、问题描述二、原因分析三、精度损失四、问题解决 一、问题描述 如果两张表的jion,关联键分布较均匀,没有明显的热点问题&…