Skip to content

Vue 项目中的 process is not defined 错误解决指南

问题描述

在 Vue + TypeScript 项目中使用 process.env.var_name 来判断开发模式或生产模式时,会出现 Uncaught ReferenceError: process is not defined 错误。这是因为在使用 Vite 构建工具的项目中,process.env 已被移除,需要采用新的环境变量访问方式。

解决方案

方案一:使用 import.meta.env(推荐)

Vite 使用 import.meta.env 来替代传统的 process.env

javascript
// 替换前
const isProduct = process.env.APP_ENV === "prod";

// 替换后
const isProduct = import.meta.env.VITE_APP_ENV === "prod";

环境变量命名规则

在 Vite 中,只有以 VITE_ 开头的环境变量才会被暴露给客户端代码:

bash
# .env 文件示例
VITE_APP_ENV=prod
VITE_API_URL=https://api.example.com
VITE_APP_TITLE=我的应用

方案二:检查运行环境

Vite 提供了内置的环境检测变量:

javascript
// 判断是否生产环境
if (import.meta.env.PROD) {
  // 生产环境逻辑
}

// 判断是否开发环境
if (import.meta.env.DEV) {
  // 开发环境逻辑
}

方案三:在 vite.config.js 中配置 process.env

如果需要兼容旧代码,可以在 Vite 配置中手动定义 process.env:

javascript
// vite.config.js
import { defineConfig, loadEnv } from "vite";
import vue from "@vitejs/plugin-vue";

export default ({ mode }) => {
  const env = loadEnv(mode, process.cwd(), "");
  return defineConfig({
    define: {
      "process.env": env,
    },
    plugins: [vue()],
    // 其他配置...
  });
};

注意

这种方法虽然能解决问题,但不是 Vite 推荐的最佳实践,可能会导致一些意外行为。

方案四:临时解决方案(不推荐)

在极少数情况下,如果只需要在特定组件中临时解决此问题:

javascript
mounted() {
  window.process = {
    env: {
      NODE_ENV: import.meta.env.MODE
    }
  };
}

不推荐使用

这种方法只是临时修补,不能解决根本问题,且可能导致其他兼容性问题。

实际应用示例

API 调用示例

javascript
// 使用 import.meta.env 访问 API 地址
const { data } = await axios.post(
  `${import.meta.env.VITE_API_URL}/register`,
  {
    name,
    email,
    password,
  }
);

环境变量配置示例

javascript
// .env.development
VITE_API_URL=http://localhost:8000/api
VITE_APP_ENV=dev

// .env.production
VITE_API_URL=https://api.example.com/api
VITE_APP_ENV=prod

常见问题

1. 环境变量未生效?

确保:

  • 变量名以 VITE_ 开头
  • 重新启动开发服务器(修改 .env 文件后需要重启)
  • 检查 .env 文件位置(应位于项目根目录)

2. 如何区分不同环境?

Vite 支持多环境配置:

  • .env # 所有环境
  • .env.development # 开发环境
  • .env.production # 生产环境

总结

Vite 使用 import.meta.env 替代了传统的 process.env 来访问环境变量,这是现代前端构建工具的改进。推荐使用标准的 import.meta.env.VITE_* 方式,它不仅更安全(只有明确前缀的变量会被暴露),而且与 Vite 的构建系统完美集成。

遵循这些最佳实践,你可以轻松地在 Vue + Vite 项目中管理环境变量,避免 process is not defined 错误。