如何交朋友Electron和Webix

介绍


一天的好时光!我想与您分享我结合使用Electron和Webix创建桌面JavaScript应用程序的个人经验。这样的捆绑软件使您可以加快界面布局的过程,尤其是在不浪费时间的情况下,以及在Webix框架可以做的其他Web事情上。

工具类


因此,让我们开始吧,我们将需要以下工具:

  1. 我们将直接在其中编写代码的编辑器。我将使用Visual Studio代码(VSC),可以从此处获取
  2. Node.js服务器,可以从此处获取下载并安装;
  3. Webix Framework是一个免费版本(Webix Standard是GNU GPLv3许可下的免费UI库),我们从此处获取webix.com/get-webix-gpl为了下载它,您需要转到上面的链接,输入电子邮件,名字和姓氏,并打三个勾号,单击“发送”,然后将下载链接发送到您的邮件中。

通常,这就是我们所需要的。

安装必要的工具


因此,我们直接进行创建:

1.安装“ node.js”。我不会在这里停留,我敢肯定,没有我,你可以做到这一点。

2.创建一个我们将在其中编写代码的文件夹-例如,electron_webix(图1)。


图。 1-创建一个工作文件夹

3.启动VSC并打开此文件夹(图2)。


图。 2-打开工作文件夹

。4.使用“ Ctrl +'”组合键打开VSC终端,然后输入“ npm init”命令,这将初始化我们的“ node.js”项目。之后,系统将询问一堆不同且非常有用的问题,无需回答。然后,我们一直无时无刻地按下“ Enter”按钮,不要担心任何不好的事情(图3)。


图。 3-项目初始化

5.直接安装Electron本身。为什么我们在VSC控制台中输入命令“ npm install --save-develectron”,然后我们坐下来等到所有东西都安装好(图4)。


图。4-电子安装

工作区组织


现在我们来看工作空间的组织。我们需要做的第一件事是创建几个文件夹和文件,这是我们不可或缺的(图5):

  • 在“ libs”文件夹中,在这里我们放置了从“ Webix”站点下载的文件;
  • “ .vscode”文件夹,在这里我们将在VSC中运行我们的应用程序的json文件;
  • 文件“ main.js”,将运行我们的Electron应用程序的主文件;
  • “ index.html”文件将包含我们的内容和标记;
  • 文件“ renderer.js”,我们应用程序的事件处理程序。与index.html结合使用;
  • 文件“ launch.json”,在文件夹“ .vscode”中,使用“ F5”按钮在“ VSC”环境中运行我们的代码所需的文件;
  • 文件“ style.css”,在此文件中,我们仍然必须注册一些样式,以便我们的窗口看起来不错。


图。5-所需的文件夹和文件

用初始内容填充工作区


让我们开始使用“ launch.json”文件填充工作区,该文件用于在“ VSC”环境中启动我们的应用程序,而无需控制台中的任何其他命令。
“ launch.json”文件的内容来自此处在这里,我们不会深入研究该文件的内容,只需将其复制并保存即可。该文件的内容如下所示(图6)。

  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Main Process",
      "type": "node",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
      "windows": {
        "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
      },
      "args" : ["."],
      "outputCapture": "std"
    }
  ]
}



图。6-“ VSC”环境中的“ launch.json”文件

接下来,我们需要更正“ package.json”文件,该文件是在运行“ npm init”命令时自动创建的。需要对其进行两行更改,如下所示(图7):

存在这样的“ package.json”:

  "name": "electron_webix",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
  "test": "echo \"Error: no test specified\" && exit 1
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^8.2.3"
  }
}

这是一个package.json:

{
  "name": "electron_webix",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
   "start": "electron ."
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^8.2.3"
  }
}


图。7-“ VSC”环境中的“ package.json”文件

现在我们来填充“ main.js”文件,从此处复制其内容插入并保存。

const { app, BrowserWindow } = require('electron')

function createWindow () {
  //   .
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  // and load the index.html of the app.
  win.loadFile('index.html')

  //   .
  win.webContents.openDevTools()
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
//  API       .
app.whenReady().then(createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  //       macOS    
  //    ,       Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
   //  MacOS     ,
   //  ,           .
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

// In this file you can include the rest of your app's specific main process
// code.            require.


图。8-“ VSC”环境中的“ main.js”文件,

此后,我们终于可以最终执行应用程序的“ F5键”的首次启动。因此,按“ F5”,这是我们的窗口(图9)。


图。9-在“ VSC”环境中的文件“ main.js”

9?这是我们的应用程序的工作区,左边是调试工具。

现在,在index.html文件中创建初始标记。为什么在“ VSC”中执行以下操作:打开文件“ index.html” =>输入“!” =>然后单击“ Enter” =>,然后单击魔术和以下结果:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

好吧,就像在“”标签之间编写代码的最佳传统一样,插入文本“ Hello world !!!”。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    Hello world!!!
</body>
</html>

之后,我们尝试再次按“ F5”并检查一切对我们都有效(图10)


。 10-“ Hello world !!!”窗口

现在,我们需要从下载的webix.zip存档中提取“ codebase”文件夹的全部内容,并将其传输到我们的libs文件夹中(图11)。

打开存档,转到codebase文件夹,获取其内容并将其传输到libs包。


图。 11-“ libs”文件夹

的内容填充“ libs”文件夹的内容后,打开“ renderer.js”文件并在其中写入以下内容:

//   
const { remote } = require('electron')
//           
let WIN = remote.getCurrentWindow()
//   webix
const webix = require('./libs/webix.min.js')
//  JQuery
$ = require('jquery')
// ,              
webix.ui({
})

接下来,我们将排版我们的界面。为什么要转到此处designer.webix.com/welcome,单击“快速入门”按钮,然后转到界面布局。例如,如图12


所示。 12-Webix Web Designer中界面的布局

图12所示的布局非常简单,只需将所需的元素拖放到Designer工作区中即可。构造函数的右侧部分用于编辑元素的属性。布局完成后(图13),您需要将其传输到renderer.js文件。为什么单击“代码”按钮并以文本形式获得现成的布局。选择此文本并将其复制。


图。 13-将布局转换为文本

之后,我们在“ VSC”中打开“ renderer.js”文件,并将复制的文本粘贴到准备好的“ webix.ui”函数中(图14)。

//   
const { remote } = require('electron')
//           
let WIN = remote.getCurrentWindow()
//   webix
const webix = require('./libs/webix.min.js')
//  JQuery
$ = require('jquery')
//               
webix.ui(
    {
        "id": 1587908357897,
        "rows": [
            {
                "css": "webix_dark",
                "view": "toolbar",
                "height": 0,
                "cols": [
                    { "view": "label", "label": "Elcetron +Webix its cool!"},
                    { "label": "-", "view": "button", "height": 38, "width": 40},
                    { "label": "+", "view": "button", "height": 38, "width": 40},
                    { "label": "x", "view": "button", "height": 38, "width": 40}
                ]
            },
            {
                "width": 0,
                "height": 0,
                "cols": [
                    { "url": "demo->5ea58f0e73f4cf00126e3769", "view": "sidebar", "width": 177 },
                    {
                        "width": 0,
                        "height": 0,
                        "rows": [
                            { "template": "Hello WORLD! ", "view": "template" },
                            {
                                "url": "demo->5ea58f0e73f4cf00126e376d",
                                "type": "bar",
                                "xAxis": "#value#",
                                "yAxis": {},
                                "view": "chart"
                            }
                        ]
                    }
                ]
            }
        ]
    }
)


图。14-添加由设计师

Suffer 创建的布局接下来,在“ VSC”中打开我们预先准备的index.html文件,并在其中按原样添加以下三行:,而
index.html文件将采用以下形式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./libs/webix.css">
    <link rel="stylesheet" href="./style.css">
    <title>Document</title>
</head>
<body>
    <script src="./renderer.js"></script>
</body>
</html>

接下来,单击“ F5”,并从Webix获得具有布局的应用程序(图15)


15-具有Webix布局的应用程序的工作窗口

添加几个芯片。


一切似乎都正常。但是,我想删除我们不需要的窗框,因为它实际上不适合我们的设计。我们将与您一起使用定制解决方案。为什么我们打开“ main.js”文件并在其中添加frame参数:创建BrowserWindow时为false,此标志删除标准菜单和窗口边框。它看起来应该像这样:

const win = new BrowserWindow({
    width: 800,
    height: 600,
    frame:false,
    webPreferences: {
      nodeIntegration: true
    }
  })

单击“ F5”,然后查看没有框架窗口的结果(图16)。


图。16-具有Webix布局的应用程序的工作窗口

仍然需要教我们的窗口如何响应鼠标事件。首先,我们将使标题处于活动状态,以便它可以在监视器屏幕上移动窗口。为什么打开“ renderer.js”文件,在其中找到view:label元素并向其中添加css:“ head_win”属性,结果应该如图17所示。

   { "view": "label", "label": "Elcetron +Webix its cool!", css:"head_win" },
                    { "label": "-", "view": "button", "height": 38, "width": 40},
                    { "label": "+", "view": "button", "height": 38, "width": 40 },
                    { "label": "x", "view": "button", "height": 38, "width": 40}


图。17-向视图中添加样式:label元素

现在,您需要将此样式注册到专门为此目的创建的文件中。打开文件“ style.css”并创建以下样式:

.head_win {
    -webkit-app-region: drag;
}

之后,我们启动“ F5”应用程序,并尝试将窗口拖到标题旁边。一切都应该工作。

最后,我们的应用程序将响应单击“-,+,x”窗口的标题按钮。为什么将以下代码添加到renderer.js文件的末尾:

//  
$$("close-bt").attachEvent("onItemClick", () => {
    const window = remote.getCurrentWindow();
    window.close();
})

//  
$$("min-bt").attachEvent("onItemClick", () => {
    const window = remote.getCurrentWindow();
    window.minimize();
})

//  
$$("max-bt").attachEvent("onItemClick", () => {
    const window = remote.getCurrentWindow();
    if (!window.isMaximized()) {
        window.maximize();
    } else {
        window.unmaximize();
    }
})

在此代码中,形式为“ $$(“ max-bt”)”的条目表示通过其“ id”访问“ Webix”元素。因此,标题按钮必须在文件“ renderer.js”中指定这些ID,我们将要做的如图18所示:

   { "view": "label", "label": "Elcetron +Webix its cool!", css:"head_win" },
                    { "label": "-", "view": "button", "height": 38, "width": 40, id:"min-bt" },
                    { "label": "+", "view": "button", "height": 38, "width": 40, id:"max-bt" },
                    { "label": "x", "view": "button", "height": 38, "width": 40, id:"close-bt" }


图。18-在视图中添加样式:标签元素

到目前为止,仅此而已。尝试它应该起作用。可以从github下载源代码,这里是链接感谢您的关注。

All Articles