首页 > 其他分享 >React--》如何高效管理前端环境变量:开发与生产环境配置详解

React--》如何高效管理前端环境变量:开发与生产环境配置详解

时间:2024-11-17 20:15:07浏览次数:3  
标签:配置文件 -- 环境 React mode env 环境变量 加载

在前端开发中,如何让项目在不同环境下表现得更为灵活与高效,是每个开发者必须面对的挑战,从开发阶段的调试到生产环境的优化,环境变量配置无疑是其中的关键。

env配置文件:通常用于管理项目的环境变量,环境变量是一些预设的值,可以根据不同的环境(如开发环境、测试环境和生产环境)动态地调整应用的配置,这些配置文件通常包含项目运行所需的各种配置参数,例如 API 地址、版本号、调试模式开关等,接下来就该文件的作用意义及其具体使用进行如下讲解:

作用和优势:在前端开发过程中,项目通常需要在不同的环境中运行,例如:

1)开发环境:通常用于本地开发和调试,可能连接到本地服务,调试模式开启。

2)生产环境:部署到线上,访问的是正式的服务器,配置和性能优化也有所不同。

        为了让项目能够在这些环境中灵活切换,开发者通常使用env配置文件来存储环境特定的变量。这些配置文件让项目能够根据不同的环境加载不同的值,从而避免了硬编码配置提高了项目的可维护性和可移植性,前端项目中的env配置文件通常使用.env文件,这个文件遵循一种简单的键值对的形式,类似于:

每行是一个环境变量的声明,REACT_APP_ 是前缀(这个前缀通常是为了符合框架的要求,如 react或vue),而后面的值则可以根据需要进行修改:

REACT_APP_API_URL=https://api.example.com
REACT_APP_DEBUG=true

使用环境变量的好处如下:

1)解耦配置:使得配置文件与代码分离,减少了配置的硬编码提升了项目的灵活性。

2)提高安全:将敏感信息如API密钥等放在.env文件中,可以避免信息泄露。

3)维护管理:不同的开发、测试和生产环境可以使用不同的配置,方便管理多个环境差异

如何使用env配置文件:前端开发框架(如react、vue等)通常提供了一些内置的机制,帮助开发者根据环境加载不同的env配置文件,例如在react中,默认支持.env文件,可以根据不同的环境使用不同的配置文件,如下所示:

env // 默认配置文件(类似全局可以使用)
env.development // 开发环境配置文件(特定环境使用)
env.production // 生产环境配置文件(特定环境使用)
env.test // 测试环境配置文件(特定环境使用)

这里我们根据上面不同的配置环境新建不同的环境变量,然后我们通过在package.json文件中通过--mode来指定要执行的环境变量,如下我们指定test环境变量:

来到控制台可以看到我们执行的test环境变量被打印了出来:

注意:因为这里我们使用了vite框架,接下来我们开始使用.env文件当中的环境变量中前缀必须是VITE_命名,否则是拿不到数据的,如下所示:  

vite使用dotenv从你的环境目录中的下列文件加载额外的环境变量:

.env // 所有情况下都会加载
.env.local // 所有情况下都会加载,但会被git忽略
.env.[mode] // 只在指定模式下加载
.env.[mode].local // 只在指定模式下加载,但会被git忽略

像我们常用的就是在不同的环境变量配置文件中,配置不同的环境变量,每次打包的时候就不需要我们去手动更改环境变量了,而是会自动寻找我们配置的环境变量文件进行打包:

使用node:在代码中使用环境变量时可以通过process.env来访问,这使得能够在代码中动态获取不同环境下的配置而不需要在代码中硬编码URL或其他敏感信息,例如在react项目中:

// 终端执行如下命令安装node类型
npm i --save-dev @types/node

// 输出 https://api.example.com
console.log(process.env.REACT_APP_API_URL); 

vite配置:根据官方文档的指出我们知道,vite默认是不加载.env文件的,因为这些文件需要在执行完vite配置后才能确定加载哪一个,举个例子root和envDir选项会影响加载行为,不过当你的确需要时你可以使用vite导出的loadEnv函数来加载指定的.env文件,如下所示:

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig(({ command, mode }) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  const env = loadEnv(mode, process.cwd(), '') // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。
  console.log(mode)
  console.log(command)
  console.log(env.VITE_APP_TITLE)
  return {
      plugins: [react()],
      build: {
          outDir: 'docs',
      },
      define: {
          'process.env': env,
      },
  }
})

然后控制台打印的数据如下所示:

其中导出函数的两个参数分别对应的值为:·command为当前项目的运行模式,开发模式它返回的值是serve,而在生产环境下为build,-mode读取的是.env文件的后缀,默认:development用于开发,production用于构建,这也就是他为什么会自动读取开发环境变量配置文件的原因:

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig(({ command, mode }) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  const env = loadEnv(mode, process.cwd(), '') // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。
  console.log(mode)
  console.log(command)
  console.log(env.VITE_PORT)
  return {
    plugins: [react()],
    server: {
      host: '0.0.0.0', // 主机
      port: Number(env.VITE_PORT), // 端口
      proxy: {
        "api": {
          target: env.VITE_APP_API_BASEURL, // 目标代理服务器地址
          changeOrigin: true, // 允许跨域
          rewrite: (path) => path.replace(/^\/api/, '') // 重写路径
        }
      },
    },
  }
})

标签:配置文件,--,环境,React,mode,env,环境变量,加载
From: https://blog.csdn.net/qq_53123067/article/details/143836589

相关文章

  • C++-练习-88
    题目:下列程序中每个try后面都使用两个catch块,以确保nbad_index异常导致方法label_val()被调用。请修改该程序,在每个try块后面只使用一个catch块,并使用RTTI来确保合适时调用label_val()。test.h#ifndefQUEUE_H_#defineQUEUE_H_#include<iostream>usingnamespacestd;......
  • Java学习教程,从入门到精通,Java继承语法知识点及案例代码(29)
    1、Java继承语法知识点及案例代码一、继承的基本概念继承是面向对象编程中的一个重要概念,指的是子类从父类继承属性和方法的能力。通过继承,子类可以直接访问父类的非私有属性和非私有方法,实现代码重用和扩展。二、继承的语法在Java中,使用关键字extends来实现继承。子类......
  • HopToDesk 安全加密、免费开源,远程桌面新选择!
    远程桌面工具越来越成为现代工作生活的刚需。你是否还在为寻找一个既安全又免费的工具而苦恼?HopToDesk,一款支持安全加密、免费开源的远程桌面软件,或许正是你的不二之HopToDesk与传统的远程桌面工具相比有哪些独特优势?它如何满足开发者和普通用户的需求?为什么说它是远程桌面工......
  • 好文转载: "在大型科技公司如何交付项目?"
    原文链接在过去大约10年的科技行业中,我交付了各种不同的项目。当需要确保项目成功时,我经常被指派领导新的项目,因为我在这方面很擅长。在大型科技公司交付项目是一项与编写代码截然不同的技能,许多擅长编写代码的人在项目交付方面却表现得很差。以下是我在领导项目时的思考以及......
  • Solution - Codeforces 1957E Carousel of Combinations
    首先这个\(C(i,j)\bmodj\)的形式就非常怪,于是首先肯定要先研究一下这个值。先考虑如何求\(C(i,j)\)。可以考虑先选出要用的\(j\)个数,再乘上其排列成环的方案数,那么有\(C(i,j)=\binom{i}{j}\times(j-1)!\)。那么就是来考虑\(\binom{i}{j}\times(j-1)!\bmod......
  • Scrum 冲刺博客 day5
    作业属于的课程计科22级12班作业要求要求作业目标七天的敏捷冲刺工作进展团队成员昨日完成工作明日完成工作遇到的困难王天一用户模块接口开发完善完成鉴权模块的具体实现,包括JWT或OAuth2的集成,提供用户登录和权限校验功能在JWT集成过程中遇到跨......
  • 团队冲刺第五天
    课程2024软件工程作业要求团队作业4——项目冲刺作业目标团队项目冲刺第五天团队会议合照燃尽图计划表格成员已完成下一步洪吉潮主题圈创建与管理功能实现设计主题圈审核的管理员界面话题发布与展示功能开发设计话题发布界面,支持文字和图片上......
  • 项目冲刺5
    一、昨日已完成的任务学习有关springboot,vue等前后端知识,明确要开发的功能,做好了商家信息等接口今日计划完成的任务完善数据库和底层框架,学习有关知识,继续做功能接口。工作中遇到的困难目前做功能接口与数据库存在困难,需要花较多时间学习。前后端对接存在沟通问题及技术障碍,......
  • 【Azure Redis】因为Redis升级引发了故障转移后的问题讨论
    问题描述AzureRedis是高可用架构,由主节点,从节点两个节点共同组成。 应用客户端连接的Redis服务器的域名,经过DNS解析为上图中LoadBalancer的IP,然后连接转发到主节点。发生故障转移(Failover)是LB后的两个Primary和Replica 节点进行了切换,这个期间没有DNS变动。对于以上情......
  • 2024-2025-1 20241411《计算机基础与程序设计》第八周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行......