浏览器:未捕获的 ReferenceError:未定义 require
我有一个文件
client.js
,它在客户端加载。该文件中有调用其他 JavaScript 文件中函数的代码。我尝试使用
var m = require('./messages');
来加载
messages.js
的内容(就像我在服务器端所做的那样),然后从该文件调用函数。但是,
require
在客户端未定义,因此会引发
Uncaught ReferenceError: require is not defined
形式的错误。
这些其他 JavaScript 文件也在客户端运行时加载,因为我将链接放在网页的标题处。因此客户端知道从这些其他文件导出的所有函数。
如何在打开服务器套接字的主
client.js
文件中从这些其他 JavaScript 文件(例如
messages.js
)调用这些函数?
这是因为
require()
不存在于浏览器/客户端 JavaScript 中。
现在您必须对客户端 JavaScript 脚本管理做出一些选择。
您有三个选项:
CommonJS 客户端实现包括(其中大多数在部署之前都需要构建步骤):
- Browserify - 您可以在浏览器中使用大多数 Node.js 模块。这是我个人最喜欢的。
- Webpack - 完成所有工作(捆绑 JavaScript 代码、CSS 等)。由于 React 的兴起,它变得流行起来,但其学习难度也很高。
- Rollup - 一个新的竞争者。它利用 ES6 模块并包含 tree-shaking 功能(删除未使用的代码)。
您可以阅读更多关于我对 Browserify 与(已弃用的)Component 的比较。
AMD 实现包括:
- RequireJS - 在客户端 JavaScript 开发人员中非常流行。由于其异步特性,它并不符合我的口味。
请注意,在您搜索选择使用哪一个时,您将阅读有关 Bower 的信息。Bower 仅适用于包依赖项,并且对 CommonJS 和 AMD 等模块定义没有意见。
我来自 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
}
})}
这为我解决了这个问题。解决方案已在 这里 提出。
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";
}