ChatGPT解决这个技术问题 Extra ChatGPT

Node.js 上的客户端:未捕获的 ReferenceError:未定义要求

我正在使用 Node.js、Express.js 和 Jade 组合编写应用程序。

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

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

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

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

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

你为什么不直接<script src="messages.js"></script>然后打电话给他们?
也许这可以成为一个解决方案,但还有另一件事让我担心。我还有一个名为“representation.js”的文件,用于抽象客户端和服务器共有的表示。在那个文件中,我也有 require 语句,在服务器端应该没问题,因为我正在运行 node.js。但是,在客户端这将是一个问题。你怎么看?
对于像我这样的新手(一周前甚至不会拼写“npm”!:-),了解 browserify 的 --require 选项导致在客户端定义 require() 可能会有所帮助。请参阅:lincolnloop.com/blog/speedy-browserifying-multiple-bundles
@Sterling Archer ......如果有 100 个这样的文件......我们不能继续加载 HTML 中的......

P
Peter Mortensen

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

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

你有三个选择:

使用

笔记!

your-script.js 中使用 require(['moudle-name']),而不是在 require('moudle-name')

使用 const {ipcRenderer} = require(['electron']),而不是const {ipcRenderer} = require('electron')


永远,永远推荐“点击这里”,永远。最好的情况是,它是 RickRoll,但我们不知道在该链接末尾等待我们的是什么。
这是帮助我!但现在我的问题是我需要手动更改需求...这是一个问题,在我编译时退出 tsconfig 中的某些东西?
P
Peter Mortensen

就我而言,我使用了另一种解决方案。

由于该项目不需要 CommonJS 并且它必须具有 ES3 兼容性(不支持模块),因此您只需从代码中删除所有导出和导入语句,因为您的 tsconfig 不包含

"module": "commonjs"

但是在您引用的文件中使用导入和导出语句

import { Utils } from "./utils"
export interface Actions {}

最终生成的代码将始终具有(至少对于 TypeScript 3.0)这样的行

"use strict";
exports.__esModule = true;
var utils_1 = require("./utils");
....
utils_1.Utils.doSomething();

你真的是说 ES3 吗? ES3 是 21 years old, from December 1999
一些旧的智能电视没有完整的 es5 支持。所以只有 es3 可以在任何地方工作。
P
Peter Mortensen

即使使用它也行不通。我认为最好的解决方案是Browserify

module.exports = {
  func1: function () {
   console.log("I am function 1");
  },
  func2: function () {
    console.log("I am function 2");
  }
};

-getFunc1.js-
var common = require('./common');
common.func1();

d
double-beep
window = new BrowserWindow({
    webPreferences: {
        nodeIntegration: true,
        contextIsolation: false
    }
});

欢迎来到 Stack Overflow,感谢您抽出时间来创建答案。然而,这个答案已经被多次作为这个问题的解决方案,因此并没有增加任何价值。如果您可以详细说明(通过edit这篇文章)这个解决方案的工作原理和方式,这个答案可能会变成很好的建议,而这正是这个网站的用途。此外,这纯粹是针对 Electron 框架的答案,问题的 OP 甚至没有使用该框架——请考虑在更合适的位置发布(更详细的版本)。
考虑更新有关此答案与其他答案有何不同的详细信息;这个答案是否解决了其他答案未解决的问题?
虽然目前尚不清楚,但不知何故奏效了。
P
Peter Mortensen

我确定。我们必须补充:

webPreferences: {
    nodeIntegration: true
}

例如:

mainWindow = new BrowserWindow({webPreferences: {
    nodeIntegration: true
}});

对我来说,问题已经解决了。


stackoverflow.com/a/56342771/2358409 基本上已经回答了这个问题
u
us_david

人们在问什么是脚本标记方法。这里是:

<script src='./local.js'></script>. 

或来自网络:

<script src='https://mycdn.com/myscript.js'></script>

您需要为您的脚本插入正确的 url。


E
Enrico

我正在尝试使用 webpack 构建 metronic。在我的 package.json 中,我不得不删除 "type": "module" 部分。

https://i.stack.imgur.com/NIMd6.png