发布于 2026-01-06 1 阅读
0

未捕获的引用错误:进程未定义

未捕获的引用错误:进程未定义

如何解决以下错误?

Uncaught ReferenceError: process is not defined
Enter fullscreen mode Exit fullscreen mode

首先,当你在Vite/React 项目中添加与以下代码等效的代码时,就会发生这种情况:

const someValue = process.env.SOME_KEY;
Enter fullscreen mode Exit fullscreen mode

换句话说,你只是想从.env文件中读取一个值,其中包含类似这样的赋值语句:

SOME_KEY=A_VERY_IMPORTANT_VALUE_YOU_NEED
Enter fullscreen mode Exit fullscreen mode

解决这个问题

  1. 打开vite.config.ts文件

  2. 添加loadEnv您的导入项:
    import { defineConfig, loadEnv } from 'vite'

  3. 添加env常量赋值:
    const env = loadEnv(mode, process.cwd(), '');

  4. define在与数组同一层级添加一个对象plugins

return {
    define: {
      'process.env.SOME_KEY': JSON.stringify(env.SOME_KEY)
    },
    plugins: [react()],
  }
Enter fullscreen mode Exit fullscreen mode

完整代码

现在,这是before&after代码。

之前的文件vite.config.ts

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
})
Enter fullscreen mode Exit fullscreen mode

文件vite.config.ts之后:

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), '');
  return {
    define: {
      'process.env.SOME_KEY': JSON.stringify(env.SOME_KEY)
    },
    plugins: [react()],
  }
})
Enter fullscreen mode Exit fullscreen mode

最后几点说明

所以,如果你和我一样,你可能会想:“等等!难道我要手动在.env文件中写入每一个新的键值对,而且还要在后面重复一遍吗vite.config.ts?”

嗯……这个方案就意味着如此!我对此并不满意,但至少它提供了一个解决方案。

为什么这个解决方案很重要?因为Netlify上的CI/CD流程会因为这个Uncaught ReferenceError: process is not defined错误而失败。

替代方案:

如果您希望避免在vite.config.ts文件中重复键名,可以采用以下方法:

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), '');
  return {
    define: {
      'process.env': env
    },
    plugins: [react()],
  }
})
Enter fullscreen mode Exit fullscreen mode

免责声明

您可能不希望将全部内容暴露process.env给前端,因此手动选择您希望在前端访问的值的键/名称,就成了一种security方法……

另外,请注意,在after建议的代码中,如果您需要手动选择键,则可能需要也可能不需要设置stringify所选键的值。

或许有更好的替代方案。

我想折中的解决方案是创建一个数组,其中包含你想从中挑选的键的名称process.env,然后遍历该数组,以便动态生成分配给该define键的对象。

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

const cherryPickedKeys = [
  "SOME_KEY_IN_YOUR_ENV_FILE",
  "SOME_OTHER_KEY_IN_YOUR_ENV_FILE",
];

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), '');
  const processEnv = {};
  cherryPickedKeys.forEach(key => processEnv[key] = env[key]);

  return {
    define: {
      'process.env': processEnv
    },
    plugins: [react()],
  }
})
Enter fullscreen mode Exit fullscreen mode

TypeScript 的最后说明

如果你的项目是用 TypeScript 编写的,则会出现智能感知问题,这也会导致 CI​​/CD 流程失败:

Cannot find name 'process'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node`.ts(2580)
Enter fullscreen mode Exit fullscreen mode

事实证明,按照 VS Code 的建议安装@types/node软件包后,问题确实解决了!

文章来源:https://dev.to/boostup/uncaught-referenceerror-process-is-not-defined-12kg