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

除了Webpack,还有哪些构建工具可以实现不同环境使用不同API地址?

除了 Webpack,目前主流的前端构建工具(如 Vite、Rollup、Parcel、Turbopack 等)均支持通过环境变量实现不同环境切换 API 地址,核心逻辑都是“构建时注入环境变量,代码中读取变量”,但具体配置细节各有差异。以下是 5 种常用工具的实现方案,覆盖不同项目场景(Vue/React/纯 JS 等):

一、Vite(推荐:Vue/React 项目,开发体验优)

Vite 是目前最流行的构建工具之一,内置了环境变量处理能力,无需额外安装插件,配置极简。

1. 核心规则
  • Vite 仅识别以 VITE_ 开头的环境变量(避免与系统变量冲突)。
  • 环境配置文件需放在项目根目录,命名格式为 .env.[环境名](如 .env.test)。
2. 实现步骤
(1)创建环境配置文件
# .env.development(开发环境,npm run dev 默认加载)
VITE_API_BASE_URL = 'http://dev-api.example.com'# .env.test(测试环境)
VITE_API_BASE_URL = 'http://test-api.example.com'# .env.production(生产环境,npm run build 默认加载)
VITE_API_BASE_URL = 'http://prod-api.example.com'
(2)在代码中使用

直接通过 import.meta.env.VITE_XXX 读取(Vite 自动注入,无需额外配置):

// src/api/request.js
const request = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL, // 直接使用环境变量timeout: 5000
});
(3)配置 package.json 命令

通过 --mode [环境名] 指定加载的配置文件:

{"scripts": {"dev": "vite", // 默认加载 .env.development"build:test": "vite build --mode test", // 加载 .env.test"build:prod": "vite build" // 默认加载 .env.production}
}

二、Rollup(推荐:类库/轻量项目,打包体积小)

Rollup 是专注于“模块打包”的工具,常用于构建 JavaScript 类库或轻量应用,需通过插件处理环境变量。

1. 安装依赖
npm install @rollup/plugin-replace --save-dev # 注入环境变量
npm install cross-env --save-dev # 跨平台设置 NODE_ENV
2. 实现步骤
(1)创建 Rollup 配置文件(rollup.config.js)
import replace from '@rollup/plugin-replace';// 根据命令行的 NODE_ENV 确定环境
const env = process.env.NODE_ENV || 'development';// 定义不同环境的 API 地址映射
const apiBaseUrlMap = {development: JSON.stringify('http://dev-api.example.com'),test: JSON.stringify('http://test-api.example.com'),production: JSON.stringify('http://prod-api.example.com')
};export default {input: 'src/index.js', // 入口文件output: {file: 'dist/bundle.js',format: 'esm' // 输出格式(根据需求选择:esm/cjs/iife)},plugins: [// 注入环境变量(替换代码中的 process.env.API_BASE_URL)replace({preventAssignment: true, // Rollup 3+ 必需,避免赋值冲突'process.env.API_BASE_URL': apiBaseUrlMap[env]})]
};
(2)在代码中使用
// src/api.js
export const fetchData = () => {return fetch(`${process.env.API_BASE_URL}/data`);
};
(3)配置 package.json 命令
{"scripts": {"build:dev": "cross-env NODE_ENV=development rollup -c","build:test": "cross-env NODE_ENV=test rollup -c","build:prod": "cross-env NODE_ENV=production rollup -c"}
}

三、Parcel(推荐:零配置项目,快速上手)

Parcel 主打“零配置”,无需手动写构建配置文件,环境变量处理也更简洁,适合快速开发小型项目。

1. 核心规则
  • Parcel 识别以 PARCEL_ 开头的环境变量,或直接使用系统环境变量。
  • 可通过 .env 文件定义环境变量(无需区分环境名,通过命令行切换)。
2. 实现步骤
(1)创建环境配置文件(可选,也可直接在命令行设置)
# .env(通用配置,可被命令行覆盖)
PARCEL_API_BASE_URL = 'http://dev-api.example.com'
(2)在代码中使用

直接通过 process.env.PARCEL_XXX 读取:

// src/App.js
console.log('API 地址:', process.env.PARCEL_API_BASE_URL);
(3)配置 package.json 命令

通过 cross-env 直接在命令行覆盖环境变量,无需额外配置文件:

{"scripts": {"dev": "parcel serve src/index.html", // 使用 .env 中的默认值"build:test": "cross-env PARCEL_API_BASE_URL=http://test-api.example.com parcel build src/index.html","build:prod": "cross-env PARCEL_API_BASE_URL=http://prod-api.example.com parcel build src/index.html"}
}

四、Turbopack(新兴工具:Next.js 推荐,速度快)

Turbopack 是 Vercel 推出的新一代构建工具,兼容 Webpack 生态,主打“比 Webpack 快 700 倍”,常用于 Next.js 项目(Next.js 13+ 已默认支持)。

1. 核心规则
  • 支持 .env 文件,识别以 NEXT_PUBLIC_ 开头的环境变量(前端可访问)。
  • 若不使用 Next.js,需通过 @turbopack/plugin-env 插件处理。
2. 实现步骤(以 Next.js 项目为例)
(1)创建环境配置文件
# .env.development
NEXT_PUBLIC_API_BASE_URL = 'http://dev-api.example.com'# .env.test
NEXT_PUBLIC_API_BASE_URL = 'http://test-api.example.com'# .env.production
NEXT_PUBLIC_API_BASE_URL = 'http://prod-api.example.com'
(2)在代码中使用
// pages/index.js
export default function Home() {return (<div><p>API 地址:{process.env.NEXT_PUBLIC_API_BASE_URL}</p></div>);
}
(3)配置 package.json 命令

Next.js 会根据 NODE_ENV 自动加载对应 .env 文件:

{"scripts": {"dev": "next dev", // NODE_ENV=development,加载 .env.development"build:test": "cross-env NODE_ENV=test next build", // 加载 .env.test"build:prod": "next build" // NODE_ENV=production,加载 .env.production}
}

五、Create React App(CRA,推荐:React 新手项目)

CRA 是 React 官方脚手架,内置了 Webpack 配置(无需手动修改),环境变量处理有固定规则,适合 React 入门项目。

1. 核心规则
  • 仅识别以 REACT_APP_ 开头的环境变量(避免与 CRA 内部变量冲突)。
  • 支持 .env.[环境名] 文件,默认加载 .env.development(开发)和 .env.production(构建)。
2. 实现步骤
(1)创建环境配置文件
# .env.development
REACT_APP_API_BASE_URL = 'http://dev-api.example.com'# .env.test
REACT_APP_API_BASE_URL = 'http://test-api.example.com'# .env.production
REACT_APP_API_BASE_URL = 'http://prod-api.example.com'
(2)在代码中使用

直接通过 process.env.REACT_APP_XXX 读取:

// src/App.js
import axios from 'axios';const api = axios.create({baseURL: process.env.REACT_APP_API_BASE_URL
});
(3)配置 package.json 命令

通过 REACT_APP_ENVNODE_ENV 切换环境(CRA 会自动加载对应文件):

{"scripts": {"start": "react-scripts start", // 加载 .env.development"build:test": "cross-env REACT_APP_ENV=test react-scripts build", // 加载 .env.test"build:prod": "react-scripts build" // 加载 .env.production}
}

六、各工具核心差异对比

构建工具环境变量前缀配置文件格式核心依赖/插件适用场景
ViteVITE_.env.[mode]内置(无需插件)Vue/React 项目、开发体验优先
Rollup自定义(无强制)代码中映射或 .env@rollup/plugin-replace类库开发、轻量应用
ParcelPARCEL_(可选).env 或命令行内置(无需插件)零配置项目、快速原型
TurbopackNEXT_PUBLIC_(Next.js).env.[mode]@turbopack/plugin-envNext.js 项目、追求速度
Create React AppREACT_APP_.env.[mode]内置(CRA 封装)React 新手项目、无需配置

七、通用注意事项

  1. 变量注入时机:所有工具均在构建阶段将环境变量硬编码到打包文件中,而非运行时动态获取(运行时需通过接口请求配置)。
  2. 安全性:前端环境变量会暴露在打包后的 JS 中,严禁存放密钥、Token、数据库密码等敏感信息(敏感配置需放在后端接口中)。
  3. 本地配置:可创建 .env.local 文件存放个人本地配置(需加入 .gitignore,避免提交到代码仓库,覆盖团队共享配置)。

文章转载自:

http://ZvWH6RCy.xnnpy.cn
http://Zf6RosOW.xnnpy.cn
http://baGPYfzl.xnnpy.cn
http://vizs192r.xnnpy.cn
http://QqcEqcr4.xnnpy.cn
http://yxe0lEsb.xnnpy.cn
http://yDk8yRIT.xnnpy.cn
http://Sh71RkRM.xnnpy.cn
http://XQkrwsVg.xnnpy.cn
http://cjFRFFzO.xnnpy.cn
http://yYIU3OWk.xnnpy.cn
http://JeyJNzhS.xnnpy.cn
http://jZ3oCgJO.xnnpy.cn
http://PPnQBaV9.xnnpy.cn
http://oYhLresn.xnnpy.cn
http://ssJc4gwI.xnnpy.cn
http://mbBdLafu.xnnpy.cn
http://ZLzkzZtI.xnnpy.cn
http://psFS07gS.xnnpy.cn
http://pzxbvTYN.xnnpy.cn
http://9Mvvi6Ic.xnnpy.cn
http://trH1tj7V.xnnpy.cn
http://U65Xj21s.xnnpy.cn
http://VjDlkMQa.xnnpy.cn
http://i2Fg3Jr0.xnnpy.cn
http://HplgqX4I.xnnpy.cn
http://82qE1OAL.xnnpy.cn
http://AHiqjzOL.xnnpy.cn
http://EnZ4CUd3.xnnpy.cn
http://0nJTmo7I.xnnpy.cn
http://www.dtcms.com/a/377385.html

相关文章:

  • sklearn聚类
  • I.MX6UL:汇编LED驱动实验
  • 计算机毕设 java 高校机房综合管控系统 基于 SSM+Vue 的高校机房管理平台 Java+MySQL 的设备与预约全流程系统
  • 设计模式-建造者观察者抽象工厂状态
  • 第5讲 机器学习生态构成
  • JAVA秋招面经
  • LVS群集
  • 半导体功率器件IGBT工艺全流程
  • Q3.1 PyQt 中的控件罗列
  • 深入解析ReentrantLock:可重入锁
  • ARM处理器总线架构解析:iCode、D-code与S-Bus
  • Qoder 前端UI/UE升级改造实践:从传统界面到现代化体验的华丽蜕变
  • Flutter多线程
  • 如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
  • JavaScript 对象说明
  • CMake目标依赖关系解析
  • 小型企业常用的元数据管理工具
  • 论文AI写作哪个软件好?实测对比5款热门AI写作工具
  • PostgreSQL 内机器学习的关键智能算法研究
  • 12公里无人机图传模组:从模糊到超高清的飞跃,抗干扰能力全面升级
  • GitHub Actions中steps下面的Setup environment设置的环境变量不能在后面步骤使用问题处理
  • YOLOv5实战-GPU版本的pytorch虚拟环境配置
  • 苍穹外卖项目实战(day7-2)-购物车操作功能完善-记录实战教程、问题的解决方法以及完整代码
  • 【VsCode】离线状态下安装插件
  • 浏览器开发CEFSharp (十七)网页自定义下载—仙盟创梦IDE
  • Nodejs读取目录下面的文件
  • docker 重命名镜像
  • 「CTF」青少年CTF·雏形系统
  • 光子计算芯片实战:Lightmatter Passage互连架构性能评测
  • 实时多模态电力交易决策系统:设计与实现