Electron 如何在沙箱中使用node和Electron的模块

前景

在Electron的沙盒中往往会需要使用node或Electron的Api,一般有以下两种方式

  1. 创建窗体时配置允许渲染进程使用node的Api
  2. 创建窗体时配置调用preload.js模块,指定暴漏Electron和node的Api

方案

配置允许渲染进程直接使用node的Api

这种方式不在这里做详细描述,可参考
Electron 如何在渲染进程中去创建新弹窗

Preload的形式(推荐)

  1. 编写preload的js文件,设计需要暴漏给沙箱(渲染进程)的Api
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electron', {
	listenCreateFile: (callback) => {
		ipcRenderer.on('createNewFile', () => {
			callback()
		})
	},
	removeListenCreateFile: () => {
		ipcRenderer.removeAllListeners('createNewFile')
	}
})
  1. 创建窗体时,引入preload的js文件
const win = new BrowserWindow({
	width: 1024,
	height: 800,
	webPreferences: {
		preload: path.join(__dirname, './preload/index.js')
	}
})
//窗体激活时注册快捷键
win.on('focus', () => {
	globalShortcut.register('CommandOrControl+N', () => {
		win.webContents.send('createNewFile') //给沙箱发送创建文件的消息
	})
})
//窗体失去焦点卸载监听
win.on('blur', () => {
	globalShortcut.unregister('CommandOrControl+N')
})
  1. 在沙箱(渲染进程)中使用
useEffect(() => {
	window.electron.listenCreateFile(createNewFile)
	return () => {
		window.electron.removeListenCreateFile()
	}
})

优缺点对比

electron/remote形式preload形式
优点可直接在沙箱(渲染进程)中使用node、electron 的api,方便安全,可指定暴露node、electron的Api
缺点具有安全风险,外部可注入node脚本来入侵使用起来相对来说比较麻烦,需维护preload的js文件

总体的来说,基于安全风险的考虑,Electron官方也是推荐使用preload的形式,也因此remote模块也在近几年中从Electron中抽离了出来,形成独立的模块来维护

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Electron 使用 node-python 可以让你在 JavaScript 调用 Python 代码,从而实现更多的功能。下面是一个简单的示例: 1. 首先,安装 node-python: ``` npm install node-python ``` 2. 在 Electron 项目的渲染进程引入 node-python: ```javascript const Python = require('node-python'); ``` 3. 在需要使用 Python 代码的地方,创建一个 Python 实例并调用 Python 函数: ```javascript const python = Python('script.py'); const result = python.myFunction(); console.log(result); ``` 其,`script.py` 是你想要调用的 Python 脚本文件,`myFunction()` 是该脚本的一个函数。 需要注意的是,如果你的 Python 代码依赖于第三方库,你需要在 Electron 项目的主进程安装这些库,例如: ``` npm install numpy ``` 然后,在主进程引入这些库: ```javascript const PythonShell = require('python-shell'); const path = require('path'); const options = { mode: 'text', pythonPath: '/usr/bin/python3', // 指定 Python 解释器路径 pythonOptions: ['-u'], // 将 stdout 和 stderr 流设置为无缓冲模式 scriptPath: path.join(__dirname, '../python'), // 指定 Python 脚本目录 args: ['arg1', 'arg2'] }; PythonShell.run('script.py', options, (err, results) => { if (err) throw err; console.log('results:', results); }); ``` 在上面的代码,我们使用了 `python-shell` 模块来执行 Python 脚本,并指定了 Python 解释器路径、脚本目录和命令行参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路西高辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值