vue3+vite-配置环境变量env

2,460 阅读3分钟

vue3+vite-配置环境变量env

一、环境变量的四种方式

官方文档中,CLI3.0有四种方式来指定环境变量:

.env                # 在所有的环境中被载入
.env.local          # 在所有的环境中被载入,但会被 git 忽略
.env.[mode]         # 只在指定的模式中被载入
.env.[mode].local   # 只在指定的模式中被载入,但会被 git 忽略

二、模式

默认情况下,一个 Vue CLI 项目有三个模式:

development  #模式用于 vue-cli-service serve
production   #模式用于 vue-cli-service build 和 vue-cli-service test:e2e
test         #模式用于 vue-cli-service test:unit	

我们可以通过为 .env 文件增加后缀来设置某个模式下特有的环境变量,意思就是:在某些文件只会在某个模式下被载入,比如:

.env.development 的文件就只会在 development 模式下被载入。

当然,我们是可以通过参数来修改默认模式的。通过–mode 后面跟上指定模式名来修改,–mode development。比如我们想在build构建的时候,使用开发环境的变量。

"build": "vue-cli-service build --mode development",
// 或者加入自定义的新命令
"dev-build": "vue-cli-service build --mode development",
  • 首先,我们在根目录下新建.env、.env.development、.env.production,它们的代码分别为

// env
VITE_APP_URL=http://www.baidu.com
 
// env.production
VITE_NODE_ENV=production
VITE_APP_URL=http://www.jingdong.com
 
 
// env.development
VITE_NODE_ENV=development
VITE_APP_URL=http://dev.taobao.com

需要注意的是,我们需要以'VITE_'大写开头。然后重新启动服务{一定要重新启动服务}

写法2:若环境变量和其它变量不想以VITE_开头 如:以 APP_ 开头

则可以在 vite.config.ts 文件中添加 envPrefix: “APP_”,

import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  
  // 自定义模式变量开头, 如:以 APP_ 开头
  // envPrefix: 'APP_',
  
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

然后我们可以通过 import.meta.env 获取我们定义的值。 有的小伙伴可能会说,如果大量的地方需要获取环境 import.meta.env。 我们可以进行优化,我们可以将这个方法挂载到vue的原型上

  • 将方法挂载到vue3.0的原型上

//在main.ts文件中
let app = createApp(App)
// 将获取环境的方法挂载到vue的原型上,方便后面的使用
app.config.globalProperties.getEnv =import.meta.env
app.use(router).use(store).use(Button).use(VanImage).mount('#app')
  • 如何使用原型中的方法

//引入
import { getCurrentInstance } from 'vue'
const { proxy }: any = getCurrentInstance();
console.log('输出的值',proxy.getEnv )
//这样就可以获取环境了。
  • 配置tsconfig.json文件

在tsconfig.json中添加 “types”: [ “vite/client” ] ,用来提供import.meta.env 上 Vite 注入的环境变量的类型定义

{
  "extends": "@vue/tsconfig/tsconfig.web.json",
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    },
      
  "types": [ "vite/client" ]  // 提供import.meta.env 上 Vite 注入的环境变量的类型定义
      
  },
  "references": [
    {
      "path": "./tsconfig.config.json"
    }
  ]
}

  • 配置env.d.ts文件

在src目录下env.d.ts中添加以下代码,可以在在代码中获取用户自定义环境变量的 TypeScript 智能提示

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

interface ImportMetaEnv {
  readonly VITE_NODE_ENV: string;//定义提示信息 数据是只读的无法被修改
  //多个变量定义多个...
}

// 因为.vue 文件不是一个常规的文件类型,ts 是不能理解 vue 文件是干嘛的,这一段是告诉 ts,vue 文件是这种类型的。
declare module '*.vue' {
  import type { DefineComponent } from 'vue'
  const component: DefineComponent<{}, {}, any>
  export default component
}
  • 使用环境变量

使用import.meta.env.VITE_NODE_ENV获取环境变量

console.log(import.meta.env.VITE_NODE_ENV) 
// 可以打印import.meta.env 查看里面的具体数据
console.log(import.meta.env) 
  • 在package.json中配置模式

"scripts": {
    "serve": "vite",   // 未指定模式的默认取 .env 文件中的配置
    "dev": "vite --mode dev",   // 取 .env.dev文件中的配置
    "pro": "vite --mode pro",   // 取 .env.pro文件中的配置
    "build": "vue-tsc --noEmit && vite build",    // 未指定模式的默认取 .env 文件中的配置
  },
  • 扩展

例如在使用axios请求后台接口时可配置基本路径为配置路径。

baseURL: import.meta.env.APP_BASE_API,