【问题标题】:Detect an Electron instance via JavaScript通过 JavaScript 检测 Electron 实例
【发布时间】:2020-08-26 17:39:25
【问题描述】:

我有一个 webapp,它将在网站上运行并作为独立的 Electron 实例(Windows 的 .exe)。

我想通过 JavaScript 判断 webapp 是否在 ElectronJS 中运行,以便为在线版本显示一些额外的功能。有什么方法可以检测到 Electron 框架实例?我想避免编写两个略有不同的 webapp 版本。

【问题讨论】:

标签: javascript electron


【解决方案1】:

只需使用此代码(从 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;
}

【讨论】:

    【解决方案2】:

    基于electron issue:

    • 对于主脚本,它们作为 Node 进程运行,因此请使用 process.versions.hasOwnProperty('electron') 或等效项

    • 对于渲染器脚本,它们在浏览器中运行,因此请使用 /electron/i.test(navigator.userAgent) 或等效项

    【讨论】:

      【解决方案3】:

      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


      进一步的想法

      您可能必须以某种方式从一个代码库中派生出两个人工制品:一个网络应用程序和一个桌面应用程序。

      假设您可以运行两种不同的构建配置,您或许可以考虑在构建过程中注入/公开环境变量。

      【讨论】:

        【解决方案4】:

        为简单起见,您可以使用名为 is-electron 的库

        【讨论】:

        • 如果我声明window.electron = {}怎么办?
        • 来自 is_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; }
        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 2011-05-26
        • 2019-11-27
        • 2011-08-27
        • 2013-12-03
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多