【发布时间】:2020-08-26 17:39:25
【问题描述】:
我有一个 webapp,它将在网站上运行并作为独立的 Electron 实例(Windows 的 .exe)。
我想通过 JavaScript 判断 webapp 是否在 ElectronJS 中运行,以便为在线版本显示一些额外的功能。有什么方法可以检测到 Electron 框架实例?我想避免编写两个略有不同的 webapp 版本。
【问题讨论】:
标签: javascript electron
我有一个 webapp,它将在网站上运行并作为独立的 Electron 实例(Windows 的 .exe)。
我想通过 JavaScript 判断 webapp 是否在 ElectronJS 中运行,以便为在线版本显示一些额外的功能。有什么方法可以检测到 Electron 框架实例?我想避免编写两个略有不同的 webapp 版本。
【问题讨论】:
标签: javascript electron
只需使用此代码(从 is-electron "library" 获取)
function isElectron() {
// Renderer process
if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {
return true;
}
// Main process
if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {
return true;
}
// Detect the user agent when the `nodeIntegration` option is set to true
if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {
return true;
}
return false;
}
【讨论】:
对于主脚本,它们作为 Node 进程运行,因此请使用
process.versions.hasOwnProperty('electron')或等效项对于渲染器脚本,它们在浏览器中运行,因此请使用
/electron/i.test(navigator.userAgent)或等效项
【讨论】:
Electron 在主进程和渲染器进程中公开对 Node.js 的完全访问权限。
来源:Electron Application Architecture
这意味着在您的渲染器线程(即应用程序中面向用户的部分)中,您可以访问 NodeJS 原生模块,例如 fs。
我建议对浏览器采用类似的方法:避免基于用户代理的条件,如果您可以,更喜欢 is-this-feature-available? 模型:
// renderer.js
try {
const fs = require('fs');
// test something (quick) that only the `fs` module can do
} catch (e) {
// probably not an electron app
}
不过,请先阅读https://www.electronjs.org/docs/tutorial/security!
进一步的想法
您可能必须以某种方式从一个代码库中派生出两个人工制品:一个网络应用程序和一个桌面应用程序。
假设您可以运行两种不同的构建配置,您或许可以考虑在构建过程中注入/公开环境变量。
【讨论】:
为简单起见,您可以使用名为 is-electron 的库
【讨论】:
window.electron = {}怎么办?
function isElectron() { // Renderer process if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { return true; } // Main process if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) { return true; } ... return false; }