【问题标题】:Uncaught ReferenceError: process is not defined未捕获的 ReferenceError:未定义进程
【发布时间】:2023-06-24 02:07:01
【问题描述】:

我正在使用 node.js 创建一个 Web 应用程序。当我运行应用程序时(通过在浏览器上打开 index.html 或在终端上使用命令“npm start”)我收到两个错误:

Uncaught ReferenceError: 进程未定义

Uncaught ReferenceError: require is not defined

我通过在我的 index.html 头标记中特别包含指向 this 脚本的链接(其中定义了 require 函数)解决了“未定义要求”错误。 但是,我找不到类似的过程功能。

我的问题是双重的:

  1. 为什么内置的node.js模块需要重新定义?为什么它们不被识别,即“内置模块”?术语“内置模块”不是意味着不需要外部/二手重新定义模块吗?

  2. 有没有办法解决这个问题?我的脚本很简单,我只是在尝试使用 node.js 的一个基本功能,所以我无法弄清楚我可能犯了什么错误。

如果有人遇到了这个问题并找到了解决方法或发生这种情况的原因,那么您将非常有帮助。

【问题讨论】:

  • 大家好!感谢您仍在尝试回答这个问题!这个问题目前很可能没有实际意义(并且可能不适用于目前的工具),因为 6 年过去了,与此同时,Web 应用程序技术取得了飞跃式的发展,并且开发过程也得到了简化。不过,有趣的是,有时它仍然有效。

标签: javascript node.js process module npm


【解决方案1】:

Node.js 代码必须由节点进程运行,而不是浏览器(代码必须在服务器中运行)。

要运行代码,你必须运行命令:

node server.js

然后,您可以通过例如输入“http://localhost:8080”从浏览器访问您的服务器。您必须有一个文件 server.js(或其他文件),其中包含您想要的服务器代码(在本例中,在端口 8080 中创建一个 Web 服务器)。

您可以按照这个简单的示例,使用 express 作为 http 服务器模块:http://expressjs.com/starter/hello-world.html

【讨论】:

  • 我正在使用命令“npm start”,它指的是 package.json 中设置为“start”的“start”脚本:“http-server -a localhost -p 8000 -c- 1”,所以它基本上是这样做的,它运行到我创建的本地服务器。不过,我得到“流程未定义”。所以这一定是另一个问题。不过还是谢谢。
  • 在scripts/start属性中我通常有类似:"start":"node server.js",如果你直接有node.js脚本,第一行必须是"#!/usr /bin/env 节点”或类似的。但是,尝试直接使用 node 命令运行。发布代码,可以澄清问题。
【解决方案2】:

Webpack 可以将环境变量注入“客户端”.js 代码(在 SPA/PWA 的情况下非常有用)。您应该将它们定义为 webpack.config.js 中的插件

webpack.config.js

module.exports = {
plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
      'process.env.MY_ENV': JSON.stringify(process.env.MY_ENV),
      ... and so on ...
    })
],
}

现在您可以在客户端访问它:

app.js

// Something like that
if(process.env.NODE_ENV === 'debug'){
    setDebugLevel(1)
}

【讨论】:

  • 我不知道为什么,但是在将项目的 webpack 从 3 迁移到 5(以及 CLI 从 3 迁移到 4)时,我突然需要这个。谢谢!
  • 很好的提示,它帮助我通过我们正在运行的 APP 环境确定 Firebase 客户端凭据。
【解决方案3】:

我通过进入我的 .eslintrc.js 文件解决了同样的问题 配置我的全局变量,将 require 和 process 添加到全局变量并将相应的值设置为“可写”。希望它对你有用。

这个链接真的很有帮助 https://eslint.org/docs/user-guide/configuring#specifying-globals

【讨论】:

  • 嘿奥卢瓦托比!欢迎来到 SOF,对于未来的答案,我个人的建议是添加一些代码或通过粘贴代码的 sn-ps 来解释。
  • 嘿@Oluwatobi。你的方法很有趣。您可以添加您的工作.eslintrc 文件吗?
【解决方案4】:

当我尝试执行此节点 js 应用程序时遇到了同样的问题:https://www.youtube.com/watch?v=mr9Mtm_TRpw

html 中的 require 是从

<script> require('./renderer.js');</script>

我改成:

<script src="./renderer.js"></script>

html 脚本中的进程也未定义。我在 js 文件中包含了 webPreferences: nodeIntegration:

win = new BrowserWindow({
    width: 800, 
    height:600, 
    icon: __dirname+'/img/sysinfo.png', 
    webPreferences: {
        nodeIntegration: true
    }
});

希望对你有所帮助。

【讨论】:

  • 那是给 Electron 的,而问题是它是一个网络应用程序。
【解决方案5】:

如果您遇到此问题并且正在使用 webpack,则可以通过在 webpack.config.js 中使用 DefinePlugin 将所需的 process 数据注入客户端包。

在下面的示例中,我展示了如何向 process.env 对象添加一些内容以在浏览器中使用:

  1. .env里面的所有环境变量使用库 dotenv
  2. NODE_ENV 的值,即'development''production'

工作示例

# .env

API_KEY=taco-tues-123
API_SECRET=secret_tacos
// webpack.config.js

const dotenv = require('dotenv').config({ path: __dirname + '/.env' })
const isDevelopment = process.env.NODE_ENV !== 'production'

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      'process.env': JSON.stringify(dotenv.parsed),
      'process.env.NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production'),
    }),
  ].filter(Boolean),
}
// Within client side bundle (React)
// src/App.jsx

console.log(process.env)          // {API_KEY: "taco-tues-123", API_SECRET: "secret_tacos"}
console.log(process.env.NODE_ENV) // development

请注意console.log(process.env) 仅具有来自.env 文件的值,而NODE_ENV 不是process.env 对象的一部分。

在下面的示例中,我展示了我是如何尝试注入导致此堆栈溢出的 process.env 对象。我还包括 webpack 文档中的一个重点,说明为什么下面的代码不起作用。

破碎示例

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        ...dotenv.parsed,
        'NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production')
      }
    }),
  ].filter(Boolean),
}
// Within client side bundle (React)
// src/App.jsx

console.log(process.env)          // Uncaught ReferenceError: taco is not defined
console.log(process.env.NODE_ENV) // development

来自 webpack DefinePlugin docs:

在定义进程首选值时的警告

'process.env.NODE_ENV': JSON.stringify('production')

结束

process: { env: { NODE_ENV: JSON.stringify('production') } }

使用后者 将覆盖可能破坏兼容性的进程对象 一些期望进程对象上的其他值的模块 已定义。

!警告!

如前所述,将dotenv.parsed 注入客户端包中会将这些秘密暴露给客户端。出于开发目的,没什么大不了的,但在部署的生产环境中,任何寻找密码或 API 私钥的人都可以看到它们。

【讨论】:

    【解决方案6】:

    如果您将 npm 模块 dotenv-webpack 与 Webpack 3 一起使用,可能是因为您使用了解构,如下所示:

    const { ENV1, ENV2 } = process.env;

    这是known issue

    丑陋的解决方法是:

    const { ENV1 } = process.env;
    const { ENV2 } = process.env;
    

    【讨论】:

    • 我在使用解构的 NextJs 项目中看到错误,而您的“丑陋”解决方法解决了该问题,但如果在调用 const { ENV1, ENV2 } = process.env 之前包含 const process = require("process"),我也能够继续使用解构。