如何在电子js中运行后台服务?

时间:2017-08-03 10:12:05

标签: javascript node.js electron

如何使用电子实现后台服务。

  

我遇到麻烦任何人都可以告诉我如何开始背景   使用电子服务甚至在关闭应用程序后运行。我有   尝试了很多解决方案,但所有解决方案都在关闭后停止服务   应用程序。

3 个答案:

答案 0 :(得分:2)

  

电子不适合在后台运行。如果你要结束了   应用程序然后它将终止与它相关的所有进程。       Electron仅用于提供GUI层。毕竟它是混合应用程序,它不与核心OS服务交互生活   本身就像后台服务。

除此之外还有两个选项:

  1. 如果您使用其他东西编写服务,比如节点或.net应用程序,那么您可能可以使用Electron与该服务进行交互(通过捆绑节点访问Windows API)。
  2. 创建系统托盘等功能。最小化应用程序到系统托盘。
  3. Ref Link

答案 1 :(得分:0)

您可以使用纸盘。这是一个示例(source):

"use strict";

// [run the app]
// $ npm install electron
// $ ./node_modules/.bin/electron .

const {app, nativeImage, Tray, Menu, BrowserWindow} = require("electron");

let top = {}; // prevent gc to keep windows

app.once("ready", ev => {
    top.win = new BrowserWindow({
        width: 800, height: 600, center: true, minimizable: false, show: false,
        webPreferences: {
            nodeIntegration: false,
            webSecurity: true,
            sandbox: true,
        },                                
    });
    top.win.loadURL("https://google.com/");
    top.win.on("close", ev => {
        //console.log(ev);
        ev.sender.hide();
        ev.preventDefault(); // prevent quit process
    });

    // empty image as transparent icon: it can click
    // see: https://electron.atom.io/docs/api/tray/
    top.tray = new Tray(nativeImage.createEmpty());
    const menu = Menu.buildFromTemplate([
        {label: "Actions", submenu: [
            {label: "Open Google", click: (item, window, event) => {
                //console.log(item, event);
                top.win.show();
            }},
        ]},
        {type: "separator"},
        {role: "quit"}, // "role": system prepared action menu
    ]);
    top.tray.setToolTip("hello electrol");
    //top.tray.setTitle("Tray Example"); // macOS only
    top.tray.setContextMenu(menu);

    // Option: some animated web site to tray icon image
    // see: https://electron.atom.io/docs/tutorial/offscreen-rendering/
    top.icons = new BrowserWindow({
        show: false, webPreferences: {offscreen: true}});
    top.icons.loadURL("https://trends.google.com/trends/hottrends/visualize");
    top.icons.webContents.on("paint", (event, dirty, image) => {
        if (top.tray) top.tray.setImage(image.resize({width: 16, height: 16}));
    });
});
app.on("before-quit", ev => {
    // BrowserWindow "close" event spawn after quit operation,
    // it requires to clean up listeners for "close" event
    top.win.removeAllListeners("close");
    // release windows
    top = null;
});

答案 2 :(得分:0)

是的,可以使用电子过程npm库。 ref:-https://www.npmjs.com/package/electron-process

首先,您必须注册要在后台运行的模块,只需创建简单的background.html,

-background.html-- 在脚本标签中添加以下行,

const background = require('electron-process').background;      
background.registerModule(require('../main/snippets/SnippetsManager'));

在主要过程中,只需创建一个浏览器窗口即可在其中运行background.html并将其保留为隐藏窗口,

-main.js-

app.once("ready", ev => {
    service = new BrowserWindow({
        width: 80, height: 60, center: true, minimizable: false, show: false,
        webPreferences: {
            nodeIntegration: false,
            webSecurity: true,
            sandbox: true,
        },
    });
    service.loadURL("file://' + __dirname + '/background.html");
    service.on("close", ev => {
        ev.sender.hide();
        ev.preventDefault(); // prevent quit process
    });
});

希望能有所帮助, 问候。