Skip to content

Environment 环境变量 ​

在前端项目中,我们通常使用 .env.xxx 文件来配置运行在不同环境下的变量定义。

文件描述脚本
.env通用环境 (可以上传 远端 git 库)
.env.development本地环境 (可以上传 远端 git 库)pnpm run dev
.env.production正式环境 (可以上传 远端 git 库)pnpm run build
.env.test测试环境 (可以上传 远端 git 库)pnpm run build --mode test
---
.env.local通用环境 (仅本地启用,无法上传共享)
.env.development.local本地环境 (仅本地启用,无法上传共享)pnpm run dev
.env.production.local正式环境 (仅本地启用,无法上传共享)pnpm run build
.env.test.local测试环境 (仅本地启用,无法上传共享)pnpm run build --mode test

预设变量 ​

  • VITE_APP_TEST_ENV --> 测试环境: test env
  • VITE_APP_API_BASE --> 接口基础路径: api base
  • VITE_APP_PAGE_BASE --> 页面资源基础路径: page base
  • VITE_APP_ROUTER_BASE --> 路由器基础路径: router base
  • VITE_APP_ROUTER_HASH --> 路由 hash 模式: WebHashHistory
  • VITE_APP_HIDDEN_SETTINGS --> 隐藏应用设置中心: hidden layout settings

类型定义 ​

TS 类型定义
typescript
/**
 * import.meta
 */
declare interface ImportMeta {
  readonly env: ImportMetaEnv;
}

/**
 * import.meta.env
 */
declare interface ImportMetaEnv {
  readonly VITE_APP_TEST_ENV: string;
  readonly VITE_APP_API_BASE: string;
  readonly VITE_APP_PAGE_BASE: string;
  readonly VITE_APP_ROUTER_BASE: string;
  readonly VITE_APP_ROUTER_HASH: string;
  readonly VITE_APP_HIDDEN_SETTINGS: string;
}
typescript
/**
 * @AppDevEnv vite 内置属性 --- 开发环境
 * @AppProdEnv vite 内置属性 --- 正式环境
 * @AppTestEnv vite 自定义属性 --- 测试环境
 * @AppApiBase vite 自定义属性 --- 接口基础路径: api base
 * @AppPageBase vite 自定义属性 --- 页面资源基础路径: page base
 * @AppRouterBase vite 自定义属性 --- 路由器基础路径: router base
 * @AppRouterUseHash vite 自定义属性 --- 路由 hash 模式: WebHashHistory
 * @AppHiddenSettings vite 自定义属性 --- 隐藏应用设置中心: hidden layout settings
 */
const AppDevEnv = bool(import.meta.env.DEV);
const AppProdEnv = bool(import.meta.env.PROD);
const AppTestEnv = bool(import.meta.env.VITE_APP_TEST_ENV || "");
const AppApiBase = format(import.meta.env.VITE_APP_API_BASE || "");
const AppPageBase = format(import.meta.env.VITE_APP_PAGE_BASE || "");
const AppRouterBase = format(import.meta.env.VITE_APP_ROUTER_BASE || "");
const AppRouterUseHash = bool(import.meta.env.VITE_APP_ROUTER_HASH || "");
const AppHiddenSettings = bool(import.meta.env.VITE_APP_HIDDEN_SETTINGS || "");

export default {
  AppDevEnv,
  AppProdEnv,
  AppTestEnv,
  AppApiBase,
  AppPageBase,
  AppRouterBase,
  AppRouterUseHash,
  AppHiddenSettings,
};

如何使用 ​

在 src 开发中引用 --> 例 src/router.ts 定义路由器
typescript
import { createRouter } from "vue-router";
import { createWebHistory } from "vue-router";
import { createWebHashHistory } from "vue-router";
import { AppRouterBase, AppRouterUseHash } from "@/configure/presetEnvironment"; 
import { baseRoutes } from "@/router.constant";
import useAppStore from "@/store/app";

export default createRouter({
  routes: baseRoutes as any,

  history: AppRouterUseHash 
    ? createWebHashHistory(AppRouterBase) 
    : createWebHistory(AppRouterBase), 

  scrollBehavior: (to, _, position) => {
    const app = useAppStore();
    const multiTab = app.multiTab;
    const keepAlive = app.keepAlive;
    const isAllowCache = to.meta.allowCache !== false;

    return !multiTab || !keepAlive || !isAllowCache || !position
      ? { top: 0, left: 0 }
      : position;
  },
});
在 vite 配置中使用 --> 例 vite.config.ts 定义 base 选项
typescript
import { loadEnv } from "vite";
import { fileURLToPath } from "node:url";
import { defineConfig } from "vitest/config";
import VueJsx from "@vitejs/plugin-vue-jsx";
import Vue from "@vitejs/plugin-vue";

export default defineConfig(({ mode }) => {
  const cwd = process.cwd(); 
  const env = loadEnv(mode, cwd); 
  const base = env.VITE_APP_PAGE_BASE || "/"; 

  return {
    root: cwd,
    base: base,

    plugins: [
      VueJsx(),
      Vue({
        script: {
          defineModel: true,
          propsDestructure: true
        },
      }),
    ],
  };
});
当 项目部署到 /previews/vue3.x 路径下时,可配置如下
  • VITE_APP_PAGE_BASE = /previews/vue3.x
  • VITE_APP_ROUTER_BASE = /previews/vue3.x

基于 MIT 许可发布