我正在构建一个Electron.js应用程序,我已经阅读了关于上下文隔离、主进程和渲染器进程等方面的文档。
我很难理解如何在不使用其他框架(如Angular或Vue)的情况下将渲染器进程代码组织到多个文件或类中。
通过将sandbox
选项设置为false
,我或多或少地实现了这个目标,这允许我将require
用于不属于Electron的外部模块。然而,据我所知,这不是一个最佳实践,因为它会带来安全风险。此外,在使用此选项时,我遇到了类方面的困难。* 只有函数才能正常工作。*
下面是给我错误的代码。我怎样才能把我的渲染器代码组织成多个文件而不发疯呢?
主文件.js
const { app, BrowserWindow, dialog, ipcMain } = require('electron');
const nodePath = require("path");
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
sandbox: false,
nodeIntegration: false,
contextIsolation: true,
preload: nodePath.join(__dirname, 'preload.js')
}
});
win.loadFile('index.html');
}
ipcMain.handle('open-dialog', async (event, arg) => {
const result = await dialog.showOpenDialog({
properties: ['openFile', 'multiSelections']
});
return result;
});
app.whenReady().then(() => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
预加载.js
const { contextBridge, ipcRenderer } = require('electron');
const Test = require('./test');
contextBridge.exposeInMainWorld('myAPI', {
Test: Test
});
渲染器.js
const api = window.myAPI;
const button = document.querySelector('#hi');
button.addEventListener('click', async () => {
const test = new api.Test();
test.hi();
});
test.js*存放要导出的函数或类的文件 *
class Test {
constructor() {
this.name = "TheSmith1222";
}
hi(){
console.log("Hi, " + this.name);
}
}
module.exports = {
Test
};
索引.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<button id="hi">Hi</button>
<script src="./renderer.js" type="module"></script>
</body>
</html>
点击输出按钮:
renderer.js:5 Uncaught (in promise) TypeError: api.Test is not a constructor
at HTMLButtonElement.<anonymous> (renderer.js:5:15)
1条答案
按热度按时间daolsyd01#
在组织/加载其他渲染进程脚本时,不需要使用
preload.js
脚本。我发现用一个
renderer.js
文件(通过<script>
标签加载到html文件中)管理不同类型的导入,即类和方法文件,也就是说,我相信如果你喜欢,你可以用其他方法来构造它。我已经包括下面列出的5个文件的代码:
我已经排除了您的
preload.js
脚本作为其内容和一般实现不影响这个问题。main.js
(主流程)一个最小的实现来让事情正常工作。
index.html
(渲染进程)用于测试目的。
renderer.js
(渲染进程)导入不同的呈现支持文件以供
html
页使用。test-1.js
(渲染进程)类的使用。
test-2.js
(渲染进程)使用标准功能。