首页IT科技vite部署(记录转载:Vite多环境配置–让项目拥有更高定制化能力)

vite部署(记录转载:Vite多环境配置–让项目拥有更高定制化能力)

时间2025-06-18 19:56:27分类IT科技浏览4157
导读:这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助...

这里给大家分享我在网上总结出来的一些知识              ,希望对大家有所帮助

业务背景

近些年来                     ,随着前端工程架构发展       ,使得前端项目中也能拥有如后端工程的模块能力              。正所谓 “能力(越)越大(来)              ,责任(越)越大(卷)              ”                     ,现在的前端工程不仅仅要满足业务需求       ,还伴随更多复杂的环境适配问题       ,例如:

老板恨不得把所有应用端都收归到一个项目里面                     ,什么微前端              、uniapp多端方案接踵而至                     。       。              。但无论是什么方案              ,都离不开一个核心点:环境变量和多环境适配                     。那么       ,今天我们就来聊下如何在Vite中实现一套拓展能力强的多环境适配方案       。

多环境场景的业务形态

我们先来了解                     ,在多环境下要求前端工程架构流程是怎样的?

如上图所示              ,在工程启动 / 构建时: 环境变量注入:一般通过命令参数模式,可在package.json里配置; 多模式文件:Vite根据环境变量来读取配置文件                     ,把文件参数抽取出来做特性区分                     ,这块也称为Vite的环境模式; 环境收集器:简单理解为1个函数,做的事情就是把第二步的特性参数归整到一处并做些特定的逻辑              ,之后通过插件生成客户端的最终参数并吐出; 客户端环境差异定制化:客户端(也就是工程里面的.vue                     、.ts       、.tsx等前端文件)获取到环境参数做一些特定区分逻辑; 构建和发布:之后就是项目根据以上几步产出的环境特性文件来打包                     ,最终推送到服务端完成整个前端工程的生产       。

Vite多环境方案实现

多模式文件配置

自定义环境变量

Vite通过 多模式 来配置不同启动场景下的特性环境变量       ,你可以创建自定义的模式文件              ,如下:

这个项目创建了4种模式分别兼容release              、beta                     、测试       、本地环境                     ,每种模式下有自己特定的环境变量       ,例如.env.local的内如如下:

# .env._local # 透传客户端参数 VITE_NODE_ENV=local VITE_OWNER=Tom VITE_POSITION=广州       ,天河 # 私有参数                     ,仅在vite server获取到              , # 假如你的项目包含此类敏感变量                     。应该将文件添加到你的 .gitignore 中       ,以避免它们被 git 检入              。 MODE_KEY=PRIVATE_KEY_LOCAL

根据Vite的约定规则                     ,只有以“VITE_                     ”开头的变量才会在客户端被捕获              ,捕获方式为:import.meta.env.{参数名}       。

至于非“VITE_       ”开头的变量属于私有属性,不会传递出去                     。假如你的项目包含此类敏感变量              。应该将文件添加到你的 .gitignore 中                     ,以避免它们被 git 检入。

完成上述配置后                     ,我们只需要在package.json增加对应的启动命令就可以让Vite获取哪个模式来运行项目了:

{ "name": "vite-mul-env-learn", "version": "0.0.0", "scripts": { "dev:local": "vite --mode _local", "dev:test": "vite --mode test", "build:beta": "vite build --mode beta", "build:release": "vite build --mode release", "lint": "eslint --fix --ext .js,.vue,ts src" } }

Vite默认环境变量

Vite 在一个特殊的import.meta.env对象上暴露环境变量                     。这里有一些在所有情况下都可以使用的内建变量:

import.meta.env.MODE: {string} 应用运行的模式                     。 import.meta.env.BASE_URL: {string} 部署应用时的基本 URL。他由base配置项决定              。 import.meta.env.PROD: {boolean} 应用是否运行在生产环境                     。 import.meta.env.DEV: {boolean} 应用是否运行在开发环境 (永远与import.meta.env.PROD相反)       。 import.meta.env.SSR: {boolean} 应用是否运行在服务器渲染环境              。

这里补充说明下,DEV 和 PROD分别对应package.json中启动dev和build命令决定的              ,而SSR则是对应了Vite启动时设定的middlewareMode变量决定的:

const { createServer: createViteServer } = require(vite) const vite = await createViteServer({ server: { middlewareMode: ssr } })

通过插件透传环境变量

很多情况下                     ,我们的环境变量不仅仅是简单的字符串       ,而是通过vite服务中二次计算才能得到最终结果              ,有点类似Vue中computed或React中useMemo       、useCallback的效果                     。 像这类非静态的环境变量                     ,我们需要借助插件能力来让它们也能够返回客户端       ,插件很多       ,这里推荐vite-plugin-environment                     ,使用大概是这样子的:

You can provide a list of environment variable names to expose to your client code:

import { defineConfig } from vite import EnvironmentPlugin from vite-plugin-environment export default defineConfig({ plugins: [ EnvironmentPlugin([API_KEY, DEBUG]), ], })

And then use them as:

const apiKey = process.env.API_KEY

在这个基础上              ,我们还能配合模式文件进行联合判断:

import { defineConfig, ConfigEnv, loadEnv } from vite; import vue from @vitejs/plugin-vue; import path from path; import EnvironmentPlugin from vite-plugin-environment; import { fetchEnv } from ./server/envUitls; // https://vitejs.dev/config/ export default defineConfig(({ command, mode }: ConfigEnv) => { const env = loadEnv(mode, __dirname); const { proxy } = fetchEnv(env.VITE_NODE_ENV); // 设置域名和端口 return { base: ./, plugins: [ vue(), EnvironmentPlugin({ PROXY: proxy }) ] }; });

const env = loadEnv(mode, __dirname);可以获取.env._local是所有非私密参数       ,接下来程序可以根据模式参数来计算最终的环境变量                     ,通过插件返回到客户端       。

fetchEnv方法可以理解成环境收集器              ,里面可以写逻辑让环境参数得到统一整合       。

客户端环境差异定制

这块就很好理解了,无非就是通过指定方法获取环境变量                     ,来条件渲染vue或React组件                     。下面做了个demo:

<script setup lang="ts"> import { ref } from vue; import { proxy } from @/api/proxy; interface IEnv extends ImportMetaEnv { VITE_NODE_ENV: string; VITE_OWNER: string; VITE_POSITION: string; } const viteEnv: IEnv = import.meta.env; </script> <template> <div class="app"> <img alt="Vue logo" src="https://www.cnblogs.com/smileZAZ/p/assets/logo.png" /> <section class="main"> <div class="card"> <h3>①通过环境文件传入的参数</h3> <div class="tips">说明:只包含"VITE_"开头参数</div> <div>项目owner:{{ viteEnv.VITE_OWNER }}</div> <div>owner位置:{{ viteEnv.VITE_POSITION }}</div> <div>项目mode:{{ viteEnv.VITE_NODE_ENV }}</div> </div> <div class="card"> <h3>②环境插件传递的参数</h3> <div class="tips"> 说明:通过vite-plugin-environment插件传递过来                     ,一般为二次计算后的参数              。假如是静态参数值则直接通过方案①传回来即可       。 </div> <p>服务请求域:{{ proxy }}</p> </div> <div class="card"> <h3>③Vite环境自带参数</h3> <div class="tips"> 说明:Vite默认参数,参考 <a href="https://cn.vitejs.dev/guide/env-and-mode.html#env-variables" >Vite环境变量</a > </div> <p>是否为SSR模式:{{ viteEnv.SSR }}</p> <p>是否为本地开发模式:{{ viteEnv.DEV }}</p> <p>是否为构建模式:{{ viteEnv.PROD }}</p> <p>当前启动命令读取的mode为:{{ viteEnv.MODE }}</p> <p>部署应用时的基本 URL:{{ viteEnv.BASE_URL }}</p> </div> </section> </div> </template> <style lang="less" scoped> .app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } .main { display: flex; .card { margin: 10px; padding: 10px; width: 300px; text-align: left; background-color: #dbf1e7; font-size: 14px; h3 { margin-bottom: 0; } .tips { margin-bottom: 10px; font-size: 12px; color: #898989; } } } </style>

效果图

解决的业务场景思考

除了本文 “业务背景       ” 模块所说的最直观的场景外              ,其实还可以做很多项目工程化相关的高阶操作                     。

假如项目构建操作放在远程服务器进行                     ,那么在构建打包前就可以联动服务api来生产出不同版本                     、不同模式的构建包       ,甚至可以把SSR逻辑放到这块来做              ,达到“千人千面                     ”的效果              。

如果对您有所帮助                     ,欢迎您点个关注       ,我会定时更新技术文档       ,大家一起讨论学习                     ,一起进步。

声明:本站所有文章              ,如无特殊说明或标注       ,均为本站原创发布                     。任何个人或组织                     ,在未征得本站同意时              ,禁止复制              、盗用       、采集                     、发布本站内容到任何网站              、书籍等各类媒体平台                     。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
yolo网络结构详解(yolov5网络结构代码解读) 如和进入组织部条件(怎么进入bios设置 进入BIOS方法大全及bios设置视频教程)