节点上的客户端.js:未捕获的引用错误:未定义 require

2022-08-29 23:10:13

我正在编写一个包含 Node.js、Express.js 和 Jade 组合的应用程序。

我有文件,它加载到客户端上。在该文件中,我有从其他JavaScript文件调用函数的代码。我的尝试是使用client.js

var m = require('./messages');

为了加载的内容(就像我在服务器端所做的那样),然后从该文件调用函数。但是,未在客户端定义,并且它会引发格式为 的错误。messages.jsrequireUncaught ReferenceError: require is not defined

这些其他JavaScript文件也在运行时在客户端加载,因为我将链接放在网页的标题上。因此,客户端知道从这些其他文件导出的所有函数。

如何从打开套接字的主文件中的其他 JavaScript 文件(如 )调用这些函数?messages.jsclient.js


答案 1

这是因为浏览器/客户端 JavaScript 中不存在。require()

现在,您将不得不对客户端JavaScript脚本管理做出一些选择。

您有三种选择:

  1. 使用标记。<script>
  2. 使用 CommonJS 实现。它具有像Node这样的同步依赖项.js
  3. 使用异步模块定义 (AMD) 实现。

CommonJS 客户端实现包括(其中大多数在部署之前需要一个构建步骤):

  1. Browserify - 您可以在浏览器中使用大多数 Node.js 模块。这是我个人最喜欢的。
  2. Webpack - 完成所有事情(捆绑JavaScript代码,CSS等)。它因 React 的激增而变得流行起来,但它因其困难的学习曲线而臭名昭著。
  3. 汇总 - 一个新的竞争者。它利用ES6模块,并包括树形震动功能(删除未使用的代码)。

您可以阅读有关我对Browserify与(已弃用)组件的比较的更多信息。

AMD 实施包括:

  1. RequireJS - 在客户端JavaScript开发人员中非常受欢迎。这不是我的口味,因为它的异步性质。

请注意,在搜索选择使用哪一个时,您将了解Bower。Bower仅适用于包依赖关系,并且在CommonJS和AMD等模块定义上不受攻击。


答案 2

我来自Electron环境,我需要渲染器进程和主进程之间的IPC通信。呈现器进程位于脚本标记之间的 HTML 文件中,并生成相同的错误。

生产线

const {ipcRenderer} = require('electron')

抛出未捕获的引用错误:未定义 require

我能够通过在浏览器窗口(嵌入此HTML文件)最初在主进程中创建时将Node.js集成指定为true来解决此问题。

function createAddItemWindow() {

    // Create a new window
    addItemWindown = new BrowserWindow({
        width: 300,
        height: 200,
        title: 'Add Item',

        // The lines below solved the issue
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false
        }
})}

这为我解决了这个问题。此处提出了解决方案。