代码之家  ›  专栏  ›  技术社区  ›  Karthik

加载electron选项卡模块时出错&无法在electron中创建选项卡

  •  17
  • Karthik  · 技术社区  · 6 年前

    我已经安装了用于在electron中实现tab的electron模块包,如下所示

    包.json

    {
      "name": "Backoffice",
      "version": "1.0.0",
      "description": "BackOffice application",
      "main": "main.js",
      "scripts": {
        "start": "electron ."
      },
      "author": "Karthik",
      "license": "ISC",
      "devDependencies": {
        "electron": "^2.0.8",
        "electron-tabs": "^0.9.4"
      }
    }
    

    const electron = require("electron");
    const app = electron.app;
    const BrowserWindow = electron.BrowserWindow;
    const Menu = electron.Menu;
    const path = require("path");
    const url = require("url");
    const TabGroup = require("electron-tabs");
    
    let win;
    const tabGroup = new TabGroup();
    
    function createWindow() {
        win = new BrowserWindow();
        win.loadURL(url.format({
            pathname:path.join(__dirname,'index.html'),
            protocol:'file',
            slashes:true
        }));
    
        win.on('closed',()=>{
            win = null;
        })
    }
    
    app.on('ready', function(){
        createWindow();
        const template = [
            {
                label : 'Backoffice',
                submenu: [
                    {
                       label : 'Account Management',
                       click : function () {
                           let tab = tabGroup.addTab({
                           title: "Electron",
                           src: "http://electron.atom.io",
                           visible: true
                        });
                        }
                    },
                    {
                        label : 'HR Management',
                        click : function () {
                            console.log("CLICK HM menu");
                        }    
                    },
                 ]
    
            }
    ]
        const menu = Menu.buildFromTemplate(template);
        Menu.setApplicationMenu(menu);
    });
    

    索引.html

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>BackOffice</title>
            <link rel="stylesheet" href="styles.css">
            <link rel="stylesheet" href="node_modules/electron-tabs/electron-tabs.css">
        </head>
        <body>
            <h1>BackOffice</h1>
            <div class="etabs-tabgroup">
                <div class="etabs-tabs"></div>
                <div class="etabs-buttons"></div>
            </div>
            <div class="etabs-views"></div>
        </body>
    </html>
    

    运行npm start时出现以下错误

    App threw an error during loadReferenceError: document is not defined at Object.<anonymous> (C:\workspace\nodejs_workspace\electron\menu-demo\node_modules\electron-tabs\index.js:3:1)
        at Object.<anonymous> (C:\workspace\nodejs_workspace\electron\menu-demo\node_modules\electron-tabs\index.js:421:3)
        at Module._compile (module.js:642:30)
        at Object.Module._extensions..js (module.js:653:10)
        at Module.load (module.js:561:32)
        at tryModuleLoad (module.js:504:12)
        at Function.Module._load (module.js:496:3)
        at Module.require (module.js:586:17)
        at require (internal/module.js:11:18)
        at Object.<anonymous> (C:\DEV_2018\nodejs_workspace\electron\menu-demo\main.js:11:18)
    
    • 是什么导致了这个错误?如何在单击上创建新选项卡

    3 回复  |  直到 6 年前
        1
  •  7
  •   pergy Javier    6 年前

    正如@coolreader18详细解释的,您必须使用 electron-tabs 渲染器进程

    这意味着您必须从主要.js单击菜单项时。 MenuItem 的单击为您提供了呼叫者 BrowserWindow 所以你可以给它发信息。

    主要.js

     ...
     {
       label: 'Account Management',
       click: function (menuItem, browserWindow, event) {
         browserWindow.webContents.send('add-tab', {
           title: 'Electron',
           src: 'http://electron.atom.io',
           visible: true
         })
       }
     },
     ...
    

    索引.html

    <body>
      ...
      <script>
        const { ipcRenderer } = require('electron')
        const TabGroup = require('electron-tabs')
        const tabGroup = new TabGroup()
    
        ipcRenderer.on('add-tab', (event, arg) => {
          tabGroup.addTab(arg)
        })
      </script>
    </body>
    
        2
  •  5
  •   coolreader18    6 年前

    documentation electron-tabs ,它提到了从渲染器进程调用它,而您是在主进程中进行调用的。主要的过程是你控制electron的api,比如像你现在这样打开窗口 main.js . 每个浏览器窗口创建一个新的渲染器进程,该进程可以与主进程通信,也可以管理自己的文档和webapi。

    document is not defined ,是因为主进程不能访问DOM,因为您可以从同一个主进程打开多个浏览器;它不知道要使用哪个浏览器。所以你需要做的是在渲染过程中加入一个脚本。创建 renderer.js ,并将 电子标签 const TabGroup = require("electron-tabs"); )在那里。然后,在你的 index.html ,放置 <script src="renderer.js"></script> ,它应该会起作用。

        3
  •  0
  •   Rapwnzel    6 年前

    可能是因为你在打电话

    const tabGroup = new TabGroup();
    

    在页面完成加载之前。

    let tabGroup;
    

    以及createWindow()的内部:

    tabGroup = new TabGroup();
    

    你必须把const改成let或var,抱歉