【问题标题】:Client on Node.js: Uncaught ReferenceError: require is not definedNode.js 上的客户端:未捕获的 ReferenceError:未定义要求
【发布时间】:2013-10-04 06:31:06
【问题描述】:

我正在使用 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 中加载.........

标签: javascript node.js sockets express pug


【解决方案1】:

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

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

或来自网络:

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

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

【讨论】:

    【解决方案2】:

    我来自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
            }
    })}
    

    这为我解决了这个问题。解决方案是here提出的。

    【讨论】:

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

    这对我有用

    1. RequireJS download page获取最新版本
      这是我们将使用的 RequestJS 文件。
    2. 将其加载到您的 HTML 内容中,如下所示: &lt;script data-main="your-script.js" src="require.js"&gt;&lt;/script&gt;

    注意事项!

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

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

    【讨论】:

    • 永远,永远推荐​​“点击这里”,永远。最好的情况是,它是 RickRoll,但我们不知道该链接末尾有什么在等待我们。
    • 这对我有帮助!!但现在我的问题是我需要手动更改需求...这是个问题,在我编译时退出 tsconfig 中的某些东西?
    【解决方案4】:
    window = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false
        }
    });
    

    【讨论】:

    • 欢迎来到 Stack Overflow,感谢您抽出宝贵的时间来创建答案。然而,这个答案已经被多次作为这个问题的解决方案,因此并没有增加任何价值。如果您可以详细说明(editing 这篇文章)这个解决方案的工作原理和方式,这个答案可能会变成很好的建议,这正是这个网站的用途。此外,这纯粹是针对 Electron 框架的答案,问题的 OP 甚至没有使用该框架——请考虑在更合适的位置发布(更详细的版本)。
    • 考虑更新此答案与其他答案有何不同的详细信息;此答案是否解决了其他答案未解决的问题?
    • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
    • 虽然不清楚,但不知何故奏效了。
    【解决方案5】:

    我确认。我们必须添加:

    webPreferences: {
        nodeIntegration: true
    }
    

    例如:

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

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

    【讨论】:

    【解决方案6】:

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

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

    它对我有用。

    【讨论】:

    • 作为参考,通过this question了解两者之间的区别可能会有所帮助。
    • You might need to use type=module, which requires you to export the functions and variable names for them to work.
    【解决方案7】:

    即使使用它也行不通。我认为最好的解决方案是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();
    

    【讨论】:

      【解决方案8】:

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

      由于该项目不需要 CommonJS 并且它必须具有 ES3 兼容性(不支持模块),您只需 删除所有 exportimport 语句来自您的代码,因为您的 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();
      

      【讨论】:

      • 你真的是说 ES3 吗? ES3 是21 years old, from December 1999
      • 一些旧的智能电视没有完全支持 es5。所以只有 es3 在任何地方都有效。
      【解决方案9】:

      ES6: 在 HTML 中,使用属性 type="module" (browser support) 包含主 JavaScript 文件:

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

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

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

      在包含的文件 (module.js) 中,您必须要导入 export the function/class

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

      一个工作的example is here。更多信息是here

      【讨论】:

      • @Curse 这里stackoverflow.com/a/44591205/860099 写成“模块创建范围以避免名称冲突”。你可以“手动”将val 放入窗口对象window.val = val。这是 plunker:Plunker:plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT?p=preview - 此解决方案有效
      • 你说的是哪个 script.js?我听不懂..你能告诉我吗
      • @MrinalAn 及其唯一的带有 js 代码的文件的示例名称
      【解决方案10】:

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

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

      您有三个选择:

      1. 使用&lt;script&gt; 标签。
      2. 使用CommonJS 实现。它具有像 Node.js 这样的同步依赖项
      3. 使用asynchronous module definition (AMD) 实现。

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

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

      你可以阅读更多关于我对Browserify vs (deprecated) Component的比较。

      AMD 实施包括:

      1. RequireJS - 在客户端 JavaScript 开发人员中非常流行。这不是我喜欢的,因为它是异步的。

      请注意,在您选择使用哪一个时,您会阅读到有关Bower 的信息。 Bower 仅用于包依赖,对 CommonJS 和 AMD 等模块定义没有意见。

      【讨论】:

      • 非常感谢。我单独做了一个小测试,这就是为什么我花了一段时间才回复的原因。我可能会在几分钟后提出一些问题,以确保我了解这种魔法是如何运作的。我只想把所有东西放在一起。再次感谢。 Browserify 似乎很摇滚! :)
      • 我认为应该将JSPM添加到列表中。
      • 我能获得一个使用&lt;script&gt; 标签在不使用nodeJs 包管理器的情况下导入React 类的示例吗?
      • 有人知道如何在 webpack 的客户端使用 require 吗?仍然收到“require is not defined 错误”
      • 是的。组件现已弃用 github.com/componentjs/component
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2012-12-16
      相关资源
      最近更新 更多