vite+ts+vue3环境变量和模式配置

双枪将
• 阅读 3117

根据不同的模式,设置http接口请求地址的baseURL。根据我自己的理解记录一下,如有不正确的地方请指正。
先说一下配置的要求:
在开发环境(执行命令vite dev/serve)下,接口地址可以在测试服务器和正式服务器之间切换。
在生产环境(vite build)下,接口地址可以在测试服务器和正式服务器之间切换。

版本信息:
"vite": "^4.0.0",
"vue": "^3.2.45",
"typescript": "~4.7.4",

配置实现:

1. 在根目录下新建文件:
//.env.development

VITE_BASE_API = https://***-test.cn:8391

//.env.production

VITE_BASE_API = https://***.cn

//.env.staging

VITE_DEV_SERVER = https://***-test.cn:8391
VITE_SERVER = https://***.cn

2.在请求封装文件request.ts中引用

let baseURL = ''
if(import.meta.env.MODE === 'staging') { // 预备模式
  // baseURL = process.env.NODE_ENV === 'development' ? import.meta.env.VITE_SERVER : import.meta.env.VITE_DEV_SERVER
  baseURL = import.meta.env.DEV ? import.meta.env.VITE_SERVER : import.meta.env.VITE_DEV_SERVER
} else { // development或production模式
  baseURL = import.meta.env.VITE_BASE_API
}

3.在package.json的scripts项添加以下命令

"scripts": {
  "dev:staging": "vite dev --mode staging",
  "build:staging": "run-p type-check build-only-staging",
  "build-only-staging": "vite build --mode staging",
}

4.TypeScript的智能提示
在src目录下创建一个env.d.ts文件,接着按下面这样增加ImportMetaEnv的定义:

/// <reference types="vite/client" />

interface ImportMetaEnv {
  readonly VITE_APP_TITLE: string
  readonly VITE_BASE_API: string
  readonly VITE_DEV_SERVER: string
  readonly VITE_SERVER: string
  // 更多环境变量...
}

interface ImportMeta {
  readonly env: ImportMetaEnv
}

5.使用

开发环境下使用正式服务器:
npm run dev:staging
生产环境下使用测试服务器:
npm run build:staging

环境变量和模式

参考:
https://cn.vitejs.dev/guide/e...
https://cn.vitejs.dev/config/...

默认情况下,执行命令vite dev/serve(开发环境),运行在development(开发)模式;执行命令vite build(生产环境)运行在production(生产)模式。
模式可以通过vite.config.ts中的mode选项配置。但是会把serve和build时的模式都覆盖掉。推荐通过命令行--mode选项来重写。

.env 文件

Vite使用dotenv从环境目录中的下列文件加载额外的环境变量:
环境目录:vite.config.ts的envDir选项可配置,默认root。

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

比如:当执行vite build时,它会自动加载项目根目录下的.env.production中可能存在的环境变量。

# .env.production
VITE_BASE_API = https://***.cn
MY_TITLE = HELLO

在应用中,可以使用import.meta.env.VITE_BASE_API设置请求地址的baseURL。
vite通过对象import.meta.env暴露出来的变量,应用的.vue和.ts/js文件中都可以访问到。但是只有以envPrefix开头的环境变量会通过import.meta.env暴露在客户端源码中。
比如上面的MY_TITLE就不能通过import.meta.env.MY_TITLE访问到。

envPrefix
vite.config.ts的配置选项,默认:VITE_

拓展变量
Vite使用dotenv-expand来直接拓展变量(扩展到process.env上)。
参考:https://github.com/motdotla/d...

环境变量

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} 应用是否运行在 server 上。

import.meta.env.PROD和import.meta.env.DEV与process.env.NODE_ENV一致,与执行的命令有关。
import.meta.env.MODE与mode配置的运行模式一致。

在配置中使用环境变量

参考:https://cn.vitejs.dev/config/
配置文件vite.config.ts中,环境变量通常可以从 process.env 获得。
注意:Vite 默认是不加载 .env 文件的,因为这些文件需要在执行完 Vite 配置后才能确定加载哪一个,举个例子,root 和 envDir 选项会影响加载行为。不过当你的确需要时,你可以使用 Vite 导出的 loadEnv 函数来加载指定的 .env 文件。

import { defineConfig, loadEnv } from 'vite'

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

问题:

在我另一个项目中:
"vite": "^3.2.4",
"vue": "^3.2.45",
"typescript": "~4.7.4",

用命令选项--mode配置模式,不仅会修改import.meta.env.MODE,还会修改 process.env.NODE_ENV。此时import.meta.env.DEV与process.env.NODE_ENV就不一致了。
因此在客户端代码中尽量用import.meta.env.DEV或import.meta.env.PROD来判断运行环境。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
MaxSky MaxSky
4年前
PHP 微信公众号消息加解密
公众号配置根据提示设置即可:【图中信息均为无意义数据,仅供参考。注意服务器地址需可接收GET/POST两种请求】AESKey直接点一下随机生成即可,Token可以生成一个UUID再把UUID进行MD5一次即可。接收关注事件消息示例请求参数校验这一步根据项目情况,可供参考:(Lumen框架)php$valida
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
Bypass 360主机卫士SQL注入防御(多姿势)
0x00前言在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。从半年前的测试虚拟机里面,翻出了360主机卫士Apache版的安装包,就当做是一个纪念版吧。这边主要分享一下几种思路,Bypass360主机卫士SQL注入防御。!(https://oscimg.osc
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
双枪将
双枪将
Lv1
门有车马客,驾言发故乡。
文章
2
粉丝
0
获赞
0