vue通过mode参数动态执行vite环境变量方式

 更新时间:2026年06月30日 09:22:43   作者:深海蓝山的博客  
这段文章详细介绍了在Vue和Vite项目中动态设置环境变量的方法,通过创建`setup.js`文件并修改`vite.config.ts`和`package.json`,来实现环境变量的动态配置,适用于需要灵活调整环境配置的场景

一、说明

通常在vue和vite项目中,若要使用环境变量,先需要在项目根目录下创建对应环境的 .env 文件,Vite 会根据 --mode 指定的模式自动加载对应文件。

这种模式需要先设置对应的.env文件,如果变量值不确定,需要动态设置时,就有点有不太适用,是否可以解除.env文件的限制,通过--mode直接动态设置vite环境变量的值呢?

二、动态设置vite环境变量

1、增加setup.js文件,用于动态设置构建参数

文件目录:scripts/setup.js

/**
 * 动态环境参数脚本,用于设置环境变量并执行 vite 命令。
 * 用法: node scripts/setup.js dev -- PA
 *      node scripts/setup.js build -- PB
 * 构建:pnpm dev:exp -- PA     pnpm build:exp -- PA
 */
const { spawn } = require('child_process');
const path = require('path');

// 获取命令行参数
const args = process.argv.slice(2);
const command = args[0]; // dev 或 build
const envFlag = args[1]; // PA 或 PB 等

// 验证参数
if (!command) {
  console.error('错误: 请指定命令 (dev 或 build)');
  process.exit(1);
}

// 提取环境模式 (去掉前缀 --)
let mode = envFlag || 'dev'; //envFlag.slice(2);
// 根据命令构建 vite 命令
const viteCommand = 'vite';
let viteArgs;

// 设置环境变量
process.env.VITE_APP_MODE = mode;
if (command === 'dev') {
  viteArgs = ['--mode', mode];
} else if (command === 'build') {
  viteArgs = ['build', '--mode', mode];
} else {
  console.error(`错误: 不支持的命令 "${command}"`);
  process.exit(1);
}

console.log(`运行环境: ${mode}`);
console.log(`执行命令: ${viteCommand} ${viteArgs.join(' ')}`);

// 执行 vite 命令
const child = spawn(viteCommand, viteArgs, {
  stdio: 'inherit',
  shell: true,
  cwd: path.resolve(__dirname, '..'),
});

child.on('exit', code => {
  process.exit(code);
});

2、将vite环境变量注入到process.env(非必需)

由于本人使用的是process.env,所以需要在vite.config.ts中注入一下,通过 import.meta.env 访问环境变量,则不需要此步骤

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

export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd());
  return {
    // 将环境变量注入到客户端代码
    define: {
      'process.env': JSON.stringify({
        NODE_ENV: process.env.NODE_ENV,
        ...env,
      }),
    },
    plugins: [vue()],
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
      },
    },
  };
});

3、在package.json的scripts中配置不同环境的命令

{
  "scripts": {
    "dev": "vite", 
    "dev:exp": "node scripts/setup.js dev",
    "build:exp": "node scripts/setup.js build",
  }
}

执行命令示例

# 启动开发服务 并指定项目参数
pnpm dev:exp -- pA

# 打包代码,并指定项目参数
pnpm build:exp -- PA

# 启动默认服务 不指定项目参数
pnpm dev

程序运行结果

三、在代码中使用环境变量

可以通过 process.env.VITE_APP_MODE 或 import.meta.env.VITE_APP_MODE ;  来获取动态编译时设置的vite环境变量参数的值。

<template>
  <div>  
  </div>
</template>
<script lang="ts" setup>
const projectMode = process.env.VITE_APP_MODE; // 获取当前运行模式
console.log('projectMode', projectMode);
</script>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解vue-cli中配置sass

    详解vue-cli中配置sass

    本篇文章主要介绍了详解vue-cli中配置sass ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue中使用和移除总线Bus的注意事项详解

    Vue中使用和移除总线Bus的注意事项详解

    Vue中的总线Bus是一种通信机制,可用于组件间的数据传递和事件触发。使用时需要注意Bus的命名和定义、监听和触发事件的方法、移除和销毁Bus的时机和方式等问题。合理使用总线Bus可以提高组件的复用性和可维护性,但过度依赖可能会导致代码耦合和难以维护
    2023-04-04
  • Vue 使用v-model实现控制子组件显隐效果

    Vue 使用v-model实现控制子组件显隐效果

    v-model 可以实现双向绑定的效果,允许父组件控制子组件的显示/隐藏,同时允许子组件自己控制自身的显示/隐藏,本文给大介绍Vue 使用v-model实现控制子组件显隐,感兴趣的朋友一起看看吧
    2023-11-11
  • el-date-picker日期时间选择器的选择时间限制到分钟级别

    el-date-picker日期时间选择器的选择时间限制到分钟级别

    文章介绍了如何使用el-date-picker 组件来限制用户选择的时间,禁止选择当前时间的日期及时分,同时允许选择其他日期的全天时分,通过设置 `pickerOptions` 对象的属性,可以实现对日期和时间的精确控制,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • vue2 web多标签输入框elinput是否当前焦点详解

    vue2 web多标签输入框elinput是否当前焦点详解

    这篇文章主要介绍了vue2 web多标签输入框elinput是否当前焦点的相关资料,讲解了如何在产品中实现用户输入文字后按下回车键生成标签并显示在页面上的功能,通过组件的使用和改造,解决了输入不连续的问题,需要的朋友可以参考下
    2025-01-01
  • vue3:setup语法糖使用教程

    vue3:setup语法糖使用教程

    <script setup>是在单文件组件中使用Composition API的编译时语法糖,下面这篇文章主要给大家介绍了关于vue3:setup语法糖使用的相关资料,需要的朋友可以参考下
    2022-08-08
  • iview的table组件自带的过滤器实现

    iview的table组件自带的过滤器实现

    这篇文章主要介绍了iview的table组件自带的过滤器实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Vue进度条progressbar组件功能

    Vue进度条progressbar组件功能

    progressbar组件在一个可以直接运行的npm包,通过Yeoman进行构建,再通过Gulp+Webpack构建工具。这篇文章给大家介绍了Vue进度条progressbar组件
    2018-04-04
  • vue源码学习之Object.defineProperty对象属性监听

    vue源码学习之Object.defineProperty对象属性监听

    这篇文章主要介绍了vue源码学习之Object.defineProperty对象属性监听,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Vue中的文字换行问题

    Vue中的文字换行问题

    这篇文章主要介绍了Vue中的文字换行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论