Vue3 Vite3 多环境配置 – 基于 vite 创建 vue3 全家桶项目(续篇)

在项目或产品的迭代过程中,通常会有多套环境,常见的有:

  • dev:开发环境
  • sit:集成测试环境
  • uat:用户接收测试环境
  • pre:预生产环境
  • prod:生产环境

环境之间配置可能存在差异,如接口地址、全局参数等。在基于 vue-cli (webpack) 的项目中只需要添加 .env.xxx 文件,然后在 package.jsonscripts 启动或打包命令中指定 mode 参数即可,获取环境变量时使用 process.env.xxxvite 使用方式类似,但获取环境变量使用 import.meta.env

1 环境变量和模式

上面提到,vite 中使用 import.meta.env 的方式来获取环境变量。在 main.ts 中添加如下代码进行测试:

const env = import.meta.env
console.log(env)

1.1 development

首先执行 yarn dev 启动服务,在浏览器控制台输出 env 的值:

Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)

可以看出 import.mata.env 中默认包括五个内置环境变量:

MODE:应用的运行模式。由于我们是通过 yarn dev 启动服务,而 yarn dev 本质是执行 vite 启动,未显式执行 mode,故 MODE 的值为 development

BASE_URL:部署应用时的基本 URL,在 vite 的配置文件 vite.config.ts 中的 base 属性指定;

PROD:是否是生产环境(即是否通过 vite build 构建)

DEV:是否是开发环境(即是否通过 vite 启动服务运行)

SSR:是否是服务端渲染模式。

1.2 production

首先执行 yarn build 打包(本质上是执行 vite build),打包完成后通过 yarn preview 对打包结果进行预览。访问预览地址,在浏览器控制塔输出如下:

Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)

可以看出模式为 production,非开发模式,是生产模式。

1.3 指定模式

修改 package.json 中的 scripts 命令,分别为开发和打包指定三种模式:dev、uat、prod。指定模式只需要在命令后通过参数 –mode 指定即可。

"scripts": {
  "dev": "yarn dev:dev",
  "dev:dev": "vite --mode dev",
  "dev:uat": "vite --mode uat",
  "dev:prod": "vite --mode prod",
  "build:dev": "vue-tsc --noEmit && vite build --mode dev",
  "build:uat": "vue-tsc --noEmit && vite build --mode uat",
  "build:prod": "vue-tsc --noEmit && vite build --mode prod",
  "preview": "vite preview"
},

执行 yarn dev:dev,浏览器输出 MODE: dev

执行 yarn dev:uat,浏览器输出 MODE: uat

执行 yarn dev:prod,浏览器输出 MODE: prod

接下来依次通过 build:xxx 先打包后再通过 preview 预览打包,结果与上面一致,浏览器输出的 MODE 与命令中 –mode 指定的值一致。

2 环境文件(.env)

Vite 使用 dotenv环境文件目录 中加载环境文件,默认情况下,环境文件目录为项目的根目录,即把环境文件放在项目根目录下。在 vite 中,可以通过配置 envDir 属性指定环境文件目录。

2.1 指定环境文件目录

在项目根目录下创建目录 env,用于存放所有的环境文件。

vite.config.ts 中添加 envDir 属性指定环境文件目录为 env

...

export default defineConfig({
  ...

  envDir: path.resolve(__dirname, './env')
})

2.2 添加环境文件

环境文件命名如下:

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

不同环境的变量可以定义在 .env.[mode] 文件中,如 .env.dev.env.prod 等,如果 .env 文件和 .env.[mode] 中有相同的 key,后者定义的值会覆盖前者。

这里咱们以三个环境为例编写 demo,分别是:

  • 开发环境,mode 为 dev,文件名为 .env.dev
  • 测试环境,mode 为 uat,文件名为 .env.uat
  • 生产环境,mode 为 prod,文件名为 .env.prod

在上面指定的环境文件目录 env 下创建上面三个文件,以及所有情况下都会加载的 .env 文件。四个文件内容如下:

.env 文件

VITE_BASE_API=/api
VITE_APP_NAME='demo app'
DEMO_STR=hello

.env.dev 文件

VITE_BASE_API=/dev-api

.env.uat 文件

VITE_BASE_API=/uat-api

.env.prod 文件

VITE_BASE_API=/prod-api

四个文件都定义了变量 VITE_BASE_API.env 中还额外定义了 VITE_APP_NAMEDEMO_STR 两个变量。

使用 yarn dev:dev 启动服务,或者先使用 yarn build:dev 打包,再通过 yarn preview 预览打包结果,浏览器中都会输出 VITE_BASE_APIVITE_APP_NAME 的值。 VITE_BASE_API 值为 .env.dev 中定义的 /dev-apiVITE_APP_NAME 值为 .env 中定义的 demo app,但是 .env 中定义的 DEMO_STR 不会输出。由此可以看出:

  1. 无论是哪种模式, .env 文件都会被加载;
  2. 如果 .env.[mode].env 中有相同的 key,对应模式的环境文件中的值会覆盖 .env 对应 key 的值;
  3. 环境变量需要以 VITE__ 开头才会暴露到 _import.meta.env 中。

有兴趣的朋友可以再添加 .env.dev.local 文件进行测试, .env.[mode].local 优先级最高。

3 TypeScript 提示

我使用的 IDE 是 WebStorm,之前在 main.ts 中将 import.meta.env 赋值给变量 env

const env = import.meta.env

输入 env.,WebStorm会有下图中的提示:

Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)

但是没有提示我们添加的环境变量。可以添加 env.d.ts 解决。在 src 目录下创建文件 env.d.ts,文件内容如下:

///

interface ImportMetaEnv {
  readonly VITE_BASE_API: string;
  readonly VITE_APP_NAME: string;
}

// eslint-disable-next-line no-unused-vars
interface ImportMeta {
  readonly env: ImportMetaEnv
}

在 ImportMetaEnv 中添加上环境文件中定义的变量即可。

此时再次在 main.ts 中输入 env.,IDEA便可以有正确的代码提示,并且可以获取该变量的类型:

Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)

4 补充说明

在基于 vue-cli(webpack) 的项目中获取环境变量是通过 process.env.xxx 的方式,如果不进行配置,在浏览器中会报错,提示 process is undefine。于是我按照网上的方式,在 vite.config.ts 中首先通过 vite 提供的 loadEnv 函数加载环境变量,然后在导出对象中添加 define 属性,在 define 中将 loadEnv 返回的结果赋值给 process.env,如下:

define: {
  'process.env': loadEnv(env.mode, process.cwd(), '')
}

通过这种方式,在开发模式下(vite 启动服务),可以正常获取到环境变量,甚至环境变量不要求以 VITE__ 开头。但是使用 _vite build 打包一直失败,在使用了 process.env 提示 parse error,到现在也不知道怎么处理。如果知道怎么处理的伙伴欢迎留言。

不过个人更推荐按照官方的方式,使用 import.meta.env

文中 demo 在 github 上搜索 vue3-vite-archetype 获取, main 分支可以直接 yarn dev 启动运行; template 分支是 yyg-cli 执行 yyg create 创建项目时拉取的模板。你也可以先执行 npm install -g yyg-cli 安装 yyg-cli 脚手架工具,然后通过 yyg create xxx 创建项目,创建后的项目包含了 vue3 vite 的全部demo。

Original: https://www.cnblogs.com/youyacoder/p/16758042.html
Author: 程序员优雅哥(公/同)
Title: Vue3 Vite3 多环境配置 – 基于 vite 创建 vue3 全家桶项目(续篇)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/801341/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 记一次odoo 启动故障

    Python 2023年5月24日
    079
  • 用matplotlib写游戏必须的代码

    from matplotlib import pylab%pylab%matplotlib notebookimport matplotlib.pyplot as pltfrom …

    Python 2023年9月3日
    046
  • python操作Excel表格小妙招:只需十行代码,可以将多张Excel合并为一张

    前几天遇见这么一个问题,手上有很多张表格,这些表格中都只有一个 sheet,需要把这些表汇总到一张表。 一张表中有多个 sheet,每一个 sheet 的名称是每张表格的文件名。 …

    Python 2023年6月9日
    090
  • Python-根据特定列拆分表

    根据某一列拆表 – coding: utf-8 –– 时间:2022/5/7 名称:【采购下单】 场景介绍:根据OrderNO 拆分多个exce…

    Python 2023年8月8日
    032
  • Word2Vec的安装与使用

    本案例在win10系统中,使用Python 3.6.5,Word2Vec 0.11.1【word2vec版本不同,使用上有一些差异,尤其在给方法、类传递参数时】。建议能用新的尽量都…

    Python 2023年8月23日
    061
  • pandas之多级索引MultiIndex

    多级index对于处理和分析复杂的数据非常有帮助,尤其是高维数据。你可以把多级索引看作是一个数组,而数组的元素是一个个的元组,每一个元组都是独一无二的。 一个创建二级索引的例子 a…

    Python 2023年8月6日
    051
  • 5年Python生涯总结出10个玩Python必备的网站

    “玩Python必备的10大精品网站”5年Python沉淀,总结一下作为一个Python玩家,必须要知道的十大精品网站。无用请吐槽!有用请点赞!!爱我请三连…

    Python 2023年8月13日
    031
  • Pandas处理时间类型数据

    时间序列数据描述 数据分析的分析对象不仅仅限于数值型和类别型两种,常用的数据类型还包括了时间类型.通过时间类型数据能够获取东岸对应的年月日和星期等信息.但时间类型数据在读入Pyth…

    Python 2023年8月16日
    055
  • 学生为什么要在CSDN写博客?

    学生为什么要在CSDN写博客? * – 引言 – 写博客的好处 – + 构建知识体系 + 提升写作能力 + 扩展人脉 + 为简历加分 + 帮助他…

    Python 2023年9月27日
    040
  • 教你三种方法,用Python制作出版级论文配图绘制

    Hello,大家好,我是程序汪小陈~ 今天我给大家介绍下如何使用Python-Matplotlib库一步步绘制可以用于出版的图表(Publication Ready Plots)。…

    Python 2023年9月2日
    052
  • 2.线性代数基础

    1.矩阵 ; 2. 特殊矩阵 正交矩阵 AAT=E(E为单位矩阵,AT表示”矩阵A的转置矩阵”。)或ATA=E,则n阶实矩阵A称为正交矩阵 正交矩阵有如下性…

    Python 2023年10月27日
    053
  • [GYCTF2020]FlaskApp

    [GYCTF2020]FlaskApp 1.前言 最近的比赛太多了,每个比赛里面的Web方向的题目都千奇百怪,最近的Web题目能够遇到一个之前了解过的漏洞是越来越难了。像我这种已经…

    Python 2023年8月12日
    080
  • MongoDB Compass的安装及使用图文说明(非常详细)

    1、下载 MongoDB Compass 预编译二进制包下载地址:https://www.mongodb.com/try/download/compass 2、安装 MongoDB…

    Python 2023年9月26日
    059
  • 前端基础之JavaScript(二)

    一、函数 1.1 函数定义 JavaScript中的函数和Python中的非常相似,只是定义方式有点区别。 // 普通函数定义 function f1() { console.lo…

    Python 2023年6月6日
    074
  • Mysql查询优化

    USE test; CREATE TABLE IF NOT EXISTS emp(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20…

    Python 2023年6月10日
    082
  • Python-pandas-画柱状图/饼图

    一 柱状图: import pandas as pd #pandas的制图功能是构建在matplotlib之上的 import matplotlib.pyplot as plt #…

    Python 2023年9月1日
    051
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球