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

IT技术 javascript node.js sockets express pug
2021-02-07 00:04:00

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

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

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

为了加载messages.js(就像我在服务器端所做的那样)的内容,然后从该文件调用函数。但是,require没有在客户端定义,它会抛出表单错误Uncaught ReferenceError: require is not defined

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

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

6个回答

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

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

您有三个选择:

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

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

  1. Browserify - 您可以在浏览器中使用大多数 Node.js module。这是我个人的最爱。
  2. Webpack - 无所不能(捆绑 JavaScript 代码、CSS 等)。它因 React 的激增而变得流行,但因其艰难的学习曲线而臭名昭著。
  3. Rollup - 一个新的竞争者。它利用 ES6 module并包括摇树功能(删除未使用的代码)。

您可以阅读更多关于我对Browserify 与 (deprecated) Component 的比较

AMD实施包括:

  1. RequireJS - 在客户端 JavaScript 开发人员中非常流行。由于其异步性质,这不是我的口味。

请注意,在您搜索选择要使用的那个时,您将阅读有关Bower 的信息Bower 仅适用于包依赖项,并且对 CommonJS 和 AMD 等module定义没有意见。

是的。组件现已弃用github.com/componentjs/component
2021-03-11 00:04:00
我认为 JSPM 应该添加到列表中。
2021-03-12 00:04:00
我能得到一个使用<script>标签导入 React 类而不使用 nodeJs 包管理器的例子吗?
2021-03-12 00:04:00
有人知道如何在 webpack 客户端使用 require 吗?仍然收到“要求未定义错误”
2021-03-26 00:04:00
非常感谢。我单独做了一个小测试,这就是为什么我花了一段时间才做出回应。我可能会在几分钟内回答一些问题,以确保我了解这种魔法是如何运作的。我只是想把所有东西放在一起。再次感谢。Browserify 似乎很摇滚!:)
2021-03-27 00:04:00

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

线

const {ipcRenderer} = require('electron')

抛出Uncaught ReferenceError: require is not defined

当浏览器窗口(嵌入此 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
        }
})}

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

好吧,这取决于您将如何使用您的电子应用程序。我引用的原始 StackOverflow 问题的评论线程简要概述了这样做的安全方面。你可以在这里关注线程但简而言之:如果将其设置为 true,则您的应用程序可以访问节点运行时,并且如果您正在执行可能是恶意的远程代码,这只会导致灾难。
2021-03-15 00:04:00
这个解决方案安全吗?我听说你不应该将 nodeIntegration 设置为 true - 是吗?我是电子新手,所以这是一个真正的问题。
2021-03-28 00:04:00
这被认为是不安全的,现在是不鼓励的做法。
2021-04-07 00:04:00
This won't work if you don't use Electron. If you don't use Electron, the above code will fail with "Unexpected token '}'".
2021-04-09 00:04:00

ES6:在 HTML 中,使用属性type="module"浏览器支持包含主要的 JavaScript 文件

<script type="module" src="script.js"></script>

script.js文件中,包含另一个文件,如下所示:

import { hello } from './module.js';
...
// alert(hello());

在包含的文件 ( module.js) 中,您必须导出您将导入的函数/类

export function hello() {
    return "Hello World";
}

一个工作示例是here更多信息在这里

@Curse 这里的stackoverflow.com/a/44591205/860099写的是“module创建一个范围以避免名称冲突。” 所以你可以“手动”放入 valwindow 对象window.val = val这是plunker:Plunker:plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT? p= preview - 这个解决方案有效
2021-04-04 00:04:00
你说的是哪个 script.js?我听不懂..你能告诉我吗
2021-04-04 00:04:00
@MrinalAnand 是带有 js 代码的文件的唯一示例名称
2021-04-08 00:04:00

require语句替换所有import语句。例子:

// Before:
const Web3 = require('web3');

// After:
import Web3 from 'web3';

它对我有用。

You might need to use type=module, which requires you to export the functions and variable names for them to work.
2021-03-15 00:04:00
作为参考,通过这个关于两者之间差异的问题可能会有所帮助
2021-03-25 00:04:00

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

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

"module": "commonjs"

但是在引用的文件中使用 import 和 export 语句

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

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

"use strict";
exports.__esModule = true;
var utils_1 = require("./utils");
....
utils_1.Utils.doSomething();
一些旧的智能电视没有完全支持 es5。所以只有 es3 可以在任何地方使用。
2021-04-06 00:04:00
你真的是说 ES3 吗?ES3 21 岁,从 1999 年 12 月开始
2021-04-07 00:04:00