[英]Client on Node.js: Uncaught ReferenceError: require is not defined
我正在使用 Node.js、Express.js 和Jade組合編寫一個應用程序。
我有文件client.js
,它已加載到客戶端。 在該文件中,我有從其他 JavaScript 文件調用函數的代碼。 我的嘗試是使用
var m = require('./messages');
為了加載messages.js
的內容(就像我在服務器端所做的那樣),然后從該文件調用函數。 但是,客戶端未定義require
,它會拋出Uncaught ReferenceError: require is not defined
形式的錯誤。
這些其他 JavaScript 文件也在客戶端運行時加載,因為我將鏈接放在網頁的 header。 所以客戶端知道從這些其他文件導出的所有功能。
如何從打開服務器套接字的主client.js
文件中的這些其他 JavaScript 文件(例如messages.js
)調用這些函數?
這是因為require()
在瀏覽器/客戶端 JavaScript 中不存在。
現在,您將不得不對客戶端 JavaScript 腳本管理做出一些選擇。
你有三個選擇:
CommonJS客戶端實現包括(其中大多數在部署之前需要構建步驟):
您可以閱讀更多關於我對Browserify 與(已棄用)組件的比較。
AMD實施包括:
請注意,在您選擇使用哪一個時,您將閱讀有關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";
}
用import
語句替換所有require
語句。 例子:
// Before:
const Web3 = require('web3');
// After:
import Web3 from 'web3';
它對我有用。
這對我有用
<script data-main="your-script.js" src="require.js"></script>
筆記!
在your-script.js
中使用require(['moudle-name'])
,而不是require('moudle-name')
使用const {ipcRenderer} = require(['electron'])
,而不是const {ipcRenderer} = require('electron')
就我而言,我使用了另一種解決方案。
由於該項目不需要 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();
即使使用它也行不通。 我認為最好的解決方案是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();
window = new BrowserWindow({
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
我確定。 我們必須補充:
webPreferences: {
nodeIntegration: true
}
例如:
mainWindow = new BrowserWindow({webPreferences: {
nodeIntegration: true
}});
對我來說,問題已經解決了。
人們在問什么是腳本標記方法。 這里是:
<script src='./local.js'></script>.
或來自網絡:
<script src='https://mycdn.com/myscript.js'></script>
您需要為您的腳本插入正確的 url。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.