节点上的客户端:未捕获的ReferenceError:未定义require

Mig*_*use 277 javascript sockets node.js express pug

所以,我正在用node/express + jade combo编写一个应用程序.

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

var m = require('./messages');
Run Code Online (Sandbox Code Playgroud)

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

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

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

JP *_*son 395

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

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

你有三个选择:

  1. 使用<script>标签.
  2. 使用CommonJS实现.像Node.js这样的同步依赖
  3. 使用AMD实现.

CommonJS客户端实现包括:

(大部分需要在部署之前进行构建步骤)

  1. Browserify - 您可以在浏览器中使用大多数Node.js模块.这是我个人的最爱.
  2. Webpack - 做所有事情(捆绑JS,CSS等).受到React.js激增的欢迎.因其艰难的学习曲线而臭名昭着.
  3. Rollup - 新的竞争者.利用ES6模块.包括树木抖动功能(删除未使用的代码).

您可以阅读有关Browserify与Component的比较的更多信息.

AMD实施包括:

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

请注意,在您搜索选择哪一个时,您会看到Bower.Bower仅用于包依赖,并且在模块定义(如CommonJS和AMD)上不受影响.

希望这会有所帮助.

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

Kib*_*phy 24

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

const {ipcRenderer} = require('electron')
Run Code Online (Sandbox Code Playgroud)

引发Uncaught ReferenceError:未定义require

当最初在主流程中创建浏览器窗口(嵌入此HTML文件的窗口)时,我可以通过将节点集成指定为true来解决此问题。

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

    //The lines below solved the issue
    webPreferences: {
        nodeIntegration: true
    }
})}
Run Code Online (Sandbox Code Playgroud)

那为我解决了这个问题。在这里提出解决方案。希望这对其他人有帮助。干杯。

  • 该解决方案安全吗?我听说你不应该将 nodeIntegration 设置为 true - 是吗?我是一名电子新手,所以这是一个真正的问题。 (3认同)
  • 这被认为是不安全的,并且现在是一种不鼓励的做法。 (3认同)

Kam*_*ski 17

ES6:在html中包含使用属性的主js文件type="module"(浏览器支持):

<script type="module" src="script.js"></script>
Run Code Online (Sandbox Code Playgroud)

并在script.js文件中包含另一个文件:

import { hello } from './module.js';
...
// alert(hello());
Run Code Online (Sandbox Code Playgroud)

在'module.js'中,您必须导出要导入的函数/类

export function hello() {
    return "Hello World";
}
Run Code Online (Sandbox Code Playgroud)

这里的工作示例.

  • @Curse 这里 /sf/answers/3121384381/ 写着“模块创建一个范围以避免名称冲突。” 所以你可以“手动”将`val`放入窗口对象`window.val = val`。这是 plunker:Plunker:http://plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT?p=preview - 此解决方案有效 (2认同)

小智 16

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

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

// After:
import Web3 from 'web3';
Run Code Online (Sandbox Code Playgroud)

它对我有用。

  • “您可能需要使用 type=module,这需要您导出函数和变量名称才能使其工作。” (3认同)

小智 5

这对我有用

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

笔记!

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

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

  • 永远、永远不要推荐“点击这里”。最好的情况是,它是一个 RickRoll,但我们不知道在该链接的末尾等待我们的是什么。 (12认同)