【Vue3】Vue3 + TypeScript 中如何区分开发和生产环境的 API 地址(支持 axios 请求

Vue3 + TypeScript 中如何区分开发和生产环境的 API 地址(支持 axios 请求)

在实际项目开发中,我们通常会遇到以下需求:

  • 本地开发时访问的是本地 API(如 http://localhost:3000);
  • 上线打包后访问的是正式环境 API(如 https://api.example.com);

本文将介绍如何在 Vue 3 + TypeScript + Vite 项目中,优雅地使用不同的 API 地址,支持 axios 请求,并通过环境变量配置让项目更清晰、灵活和易维护。


🔧 技术栈

  • Vue 3
  • TypeScript
  • Vite 构建工具
  • Axios(HTTP 请求库)

🚀 项目背景

假设你有一段代码如下:

const response = await axios.get(`http://ip:port/api/download-font/${fontName}`, {responseType: 'blob'
});

这段代码在开发环境可以正常使用,但一旦上线到生产环境,就无法动态切换 API 地址。这将导致部署失败或者前端资源访问错误。


✅ 正确做法:使用环境变量动态配置 API 地址

1️⃣ 配置环境变量文件

在项目根目录下创建以下两个文件:

.env.development
VITE_API_BASE_URL=http://localhost:3000
.env.production
VITE_API_BASE_URL=https://api.example.com

💡注意事项:

  • 文件名必须是 .env.环境名,对应 vite 中的 mode。
  • 变量名必须以 VITE_ 开头,才能在代码中访问。

2️⃣ 在代码中使用环境变量

Vite 提供了 import.meta.env 方式访问环境变量:

const response = await axios.get(`${import.meta.env.VITE_API_BASE_URL}/api/download-font/${fontName}`,{responseType: 'blob'}
);

这样,当你运行 npm run dev 时,会自动使用开发地址;
当你执行 npm run build 时,Vite 会自动加载生产环境配置。


3️⃣ 可选优化:封装 Axios 实例

为了代码更加规范,我们可以统一封装一个 axios 实例。

src/utils/axios.ts
import axios from 'axios';const request = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL,timeout: 10000,
});export default request;
使用方式:
import request from '@/utils/axios';const response = await request.get(`/api/download-font/${fontName}`, {responseType: 'blob'
});

这样即使以后 API 地址变更,也只需修改环境变量即可,项目结构更加清晰。


🎯 最终目录结构示例

├── .env.development
├── .env.production
├── src
│   ├── utils
│   │   └── axios.ts
│   ├── views
│   │   └── DownloadPage.vue

🛠️ 常见问题

❓为什么要以 VITE_ 开头?

Vite 出于安全性考虑,只会将 VITE_ 开头的变量注入到客户端环境中。否则你定义了环境变量,代码里是访问不到的。


📦 构建与运行

  • 开发环境:

    npm run dev
    
  • 构建生产包:

    npm run build
    

Vite 会根据 NODE_ENV 自动加载对应 .env.xxx 文件。


🧠 总结

本文介绍了如何在 Vue 3 + TypeScript 项目中,通过 Vite 的环境变量机制区分开发和生产环境的 API 地址,并结合 axios 统一封装,提高项目的可维护性和扩展性。

📌 不要硬编码 IP 地址,使用 .env 文件配置才是最佳实践!

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

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

相关文章

【数据结构】线性表之“双链表(带头循环双向链表)”

- 第 99 篇 - Date: 2025 - 05 - 25 Author: 郑龙浩/仟墨 【数据结构】 续上一篇: 线性表之“单链表” 文章目录 “双链表(带头双向循环链表)” 的实现:分步解释所有函数:test.cDListNode.hDListNode.c “双链表(带头双向循环链表…

【学习笔记】Transformer

学习的博客(在此致谢): 初识CV - Transformer模型详解(图解最完整版) 1 整体结构 Transformer由Encoder和Decoder组成,分别包含6个block。 Transformer的工作流程大体如下: 获取每个单词的em…

[MMU]IOMMU的主要职能及详细的验证方案

IOMMU的主要职能及详细的验证方案 摘要:IOMMU(Input/Output Memory Management Unit)是一种硬件组件,负责管理I/O设备对内存的直接访问(DMA,Direct Memory Access),其主要作用是提供…

动物类 如何使用Yolov11训练使用牛羊数据集 实现对牛羊进行检测数据集

牛羊检测数据集 3700张 平视视角牛羊检测 带标注 voc yolo 牛羊检测数据集 3700张 牛羊检测平视 带标注 voc yolo 分类名: (图片张数,标注个数) cattle: (1395,4309) sheep: (2393,1 1205) 总数: (3791, 15514) 总类(nc): 2类 以…

搭建frp内网穿透

前言 内网穿透的原理我就不多说了哈,既然会看到我这篇文章,想必都知道内网穿透是做什么的吧 frp分为服务端和客户端,服务端一般是搭在公网服务器中,客户端一般搭在本地或者局域网,需要提前在服务端搭好ftp server&am…

Tailwind CSS 实战,基于 Kooboo 构建 AI 对话框页面(四):语音识别输入功能

基于前三章的内容,开发AI 对话框语音识别输入功能: Tailwind css实战,基于Kooboo构建AI对话框页面(一)-CSDN博客 Tailwind css实战,基于Kooboo构建AI对话框页面(二):实…

ollama list模型列表获取 接口代码

ollama list模型列表获取 接口代码 curl http://localhost:11434/v1/modelscoding package hcx.ollama;/*** ClassName DockerOllamaList* Description TODO* Author dell* Date 2025/5/26 11:31* Version 1.0**/import java.io.BufferedReader; import java.io.InputStreamR…

ISOLAR软件生成报错处理(五)

错误1 An error has occurred. See error log for more details. java.lang.NullPointerException 这东西不用管&#xff0c;不影响生成 错误2 Description Resource Path Location Type Target ARObject: <xxxx> CompuMethod used for floating-point data conversi…

前端开发定时,ES学习,java集合

1.前端vue3加入定时任务&#xff1a; import { onMounted, ref,onUnmounted } from vue;//初始化&#xff0c;结束调用部分引用let timer: any;//定时器onMounted(async () > {timer setInterval(() > {open()//需要定时的任务}, 60000)//一分钟调用一次}); onUnmounte…

Photoshop2025(PS2025)软件及安装教程

在数字图像编辑领域&#xff0c;Adobe Photoshop 一直是无可争议的王者。如今&#xff0c;Photoshop 2025 重磅登场&#xff0c;再次为我们带来了惊喜与变革&#xff0c;进一步巩固了它在行业中的领先地位。 Photoshop 2025 在人工智能方面的升级令人瞩目。其全新的 “Magic Se…

【SQL Server Management Studio 连接时遇到的一个错误】

第一次用SQL Server Management Studio启动之后第一步就是要建立连接 但是不知道Server Name要填什么&#xff0c;看了网上的教程说是要找到下面这个注册表中对应的实例名称填上去&#xff0c;或者前面加localhost 但是好像都没有用&#xff0c;一直遇到报错如下&#xff1a;…

高等数学基础(向量矩阵及其创建和特殊的矩阵)

向量 向量是机器学习最底层的组成部分, 也是基础数据的表示形式, 线性代数通过将研究对象拓展到向量, 对多维数据进行统一研究, 而进化出的方法方便我们可以研究和解决真实世界中的问题 标量 标量也称为"无向量", 使用一个单独的数表示数值大小, 可以有正负之分, …

IBM DB2数据库管理工具IBM Data Studio

一、介绍 IBM Data Studio 是 IBM 提供的一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于支持数据管理、开发、优化和管理数据库应用程序&#xff0c;特别是在 IBM Db2 和其他数据库平台上。它提供了许多功能&#xff0c;以帮助开发人员和数据库管理员提高生产力…

Java异常处理的全面指南

Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…

MediaMtx开源项目学习

这个博客主要记录MediaMtx开源项目学习记录,主要包括下载、推流(摄像头,MP4)、MediaMtx如何使用api去添加推流,最后自定义播放器,播放推流后的视频流,自定义Video播放器博客地址 1 下载 MediaMTX MediaMTX 提供了预编译的二进制文件,您可以从其 GitHub 页面下载: Gi…

【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、监听编辑器事件1、常用编辑器事件2、示例监听播放模…

Spring Boot+Activiti7入坑指南初阶版

介绍  Activiti 是一个轻量级工作流程和业务流程管理 (BPM) 平台,面向业务人员、开发人员和系统管理员。其核心是一个超快且坚如磐石的 Java BPMN 2 流程引擎。它是开源的,并根据 Apache 许可证分发。Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。它与 Spri…

VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理

​一、软件介绍 文末提供程序和源码下载 VoltAgent 是一个开源 TypeScript 框架&#xff0c;用于构建和编排 AI 代理 二、什么是 VoltAgent&#xff1f; AI 代理框架提供了构建由自主代理提供支持的应用程序所需的基础结构和工具。这些代理通常由大型语言模型 &#xff08;&am…

《仿盒马》app开发技术分享-- 订单详情页(端云一体)

开发准备 在之前的章节中我们实现了订单的提交&#xff0c;以及提交之后跳转到确认订单页面&#xff0c;在确认订单页面我们添加了一个入口&#xff0c;这个入口是查询订单&#xff0c;当我们点击入口时&#xff0c;我们需要跳转到一个新的界面&#xff0c;这个界面通过接收上…

传统项目管理总拖延?Scrum敏捷全流程拆解

在互联网高速发展的时代&#xff0c;企业竞争的核心要素正逐渐向 "速度" 倾斜。市场环境瞬息万变&#xff0c;用户需求呈现出多元化、动态化的显著特征&#xff0c;而传统管理模式固有的滞后性与僵化性&#xff0c;已难以匹配快速迭代的市场需求。在此背景下&#xf…