Introdução
Boa hora do dia! Gostaria de compartilhar com você minha experiência pessoal na criação de um aplicativo JavaScript para desktop usando uma combinação de Electron e Webix. Esse pacote permite acelerar o processo de layout da interface, especialmente sem perder tempo com o layout e outras coisas da Web que a estrutura Webix pode fazer.Ferramentas
Então, vamos começar, precisaremos das seguintes ferramentas:- Um editor no qual escreveremos nosso código diretamente. Vou usar o código do visual studio (VSC), que pode ser obtido daqui ;
- Servidor Node.js, que pode ser obtido a partir daqui . Faça o download e instale;
- O Webix Framework é uma versão gratuita (o Webix Standard é uma biblioteca de interface do usuário gratuita sob a licença GNU GPLv3), que retiramos daqui webix.com/get-webix-gpl . Para fazer o download, você precisa acessar o link acima, inserir um email, nome e sobrenome, colocar três marcas de seleção, clicar em enviar e, em seguida, um link de download será enviado para o seu e-mail.
Em geral, é tudo o que precisamos.Instale as ferramentas necessárias
Portanto, prosseguimos diretamente para a criação:1. Instale "node.js". Não vou parar por aqui. Tenho certeza de que você pode fazer isso sem mim.2. Crie uma pasta na qual escreveremos nosso código - por exemplo, electron_webix (Fig. 1).
FIG. 1 - Criando uma pasta de trabalho3. Inicie o VSC e abra esta pasta (Fig. 2).
FIG. 2 - Abra a pasta de trabalho4. Abra o terminal VSC com a combinação de teclas "Ctrl + '" e digite o comando "npm init", que inicializará o projeto "node.js". Depois disso, o sistema solicitará um monte de perguntas diferentes e muito úteis, que não precisam ser respondidas. Em seguida, pressionamos o tempo todo com confiança no botão "Enter" e não pensamos em nada de ruim (Fig. 3).
FIG. 3 - Inicialização do projeto5. Instale diretamente o próprio elétron. Por que inserimos o comando “npm install --save-dev electron” no console do VSC, então sentamos e esperamos até que tudo esteja instalado (Fig. 4).
FIG. 4 - Instalação do elétronOrganização do espaço de trabalho
Agora nos voltamos para a organização do espaço de trabalho. A primeira coisa que precisamos fazer é criar várias pastas e arquivos que não podemos ficar sem (Figura 5):- a pasta “libs”, aqui colocamos os arquivos baixados do site “Webix”;
- a pasta “.vscode”, aqui colocamos o arquivo json que executará nosso aplicativo no VSC;
- arquivo "main.js", o arquivo principal que executará nosso aplicativo Electron;
- o arquivo "index.html" conterá nosso conteúdo e marcação;
- arquivo "renderer.js", o manipulador de eventos de nosso aplicativo. Funciona em conjunto com index.html;
- arquivo "launch.json", na pasta ".vscode", o arquivo necessário para executar nosso código no ambiente "VSC" usando o botão "F5";
- arquivo "style.css", neste arquivo ainda precisamos registrar alguns estilos para que nossa janela pareça decente.
FIG. 5 - Pastas e arquivos necessáriosPreencher a área de trabalho com conteúdo inicial
Vamos começar a preencher a área de trabalho com o arquivo "launch.json", que é usado para iniciar nosso aplicativo no ambiente "VSC" sem nenhum comando adicional do console.O conteúdo do arquivo "launch.json" foi retirado daqui . Aqui não vamos nos aprofundar no conteúdo deste arquivo, apenas copie-o e salve-o. O conteúdo do arquivo é apresentado abaixo (Fig. 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"
}
]
}
FIG. 6 - O arquivo “launch.json” no ambiente “VSC”Em seguida, precisamos corrigir o arquivo “package.json”, que foi criado automaticamente quando o comando “npm init” foi executado. Ele precisa ser alterado em duas linhas, como mostrado abaixo (Fig. 7):Havia um “pacote.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"
}
}
Aqui está um package.json:{
"name": "electron_webix",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"start": "electron ."
},
"author": "",
"license": "ISC",
"devDependencies": {
"electron": "^8.2.3"
}
}
FIG. 7 - O arquivo “package.json” no ambiente “VSC”Agora passamos a preencher o arquivo “main.js”, copie seu conteúdo daqui . Insira e salve.const { app, BrowserWindow } = require('electron')
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
})
win.loadFile('index.html')
win.webContents.openDevTools()
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow()
}
})
FIG. 8 - O arquivo “main.js” no ambiente “VSC”.Depois disso, finalmente podemos finalmente executar o primeiro lançamento da “tecla F5” do nosso aplicativo. Então, pressione “F5” e aqui está a nossa janela (Fig. 9).
FIG. 9 - Arquivo “main.js” no ambiente “VSC”, o
que vemos na Fig. 9? Esta é a área de trabalho do nosso aplicativo à esquerda e as ferramentas de depuração à direita.Agora crie a marcação inicial no arquivo index.html. Por que fazer o seguinte em "VSC": abra o arquivo "index.html" => digite "!" => e clique em "Enter" => e depois a mágica e o seguinte resultado:<!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>
Bem, como na melhor tradição de escrever código entre as tags "", insira o texto "Olá, mundo !!!"<!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>
Depois disso, tentamos pressionar “F5” novamente e verificar se tudo funciona para nós (Fig. 10)
Fig. 10 - Janela "Olá, mundo !!!"Agora precisamos extrair todo o conteúdo da pasta “codebase” do arquivo webix.zip que baixamos e transferi-lo para a nossa pasta libs (Fig. 11).Abra o arquivo morto, vá para a pasta codebase, pegue seu conteúdo e transfira-o para o pacote libs.
FIG. 11 - O conteúdo da pasta “libs”Depois de preencher o conteúdo da pasta “libs”, abra o arquivo “renderer.js” e escreva o seguinte:
const { remote } = require('electron')
let WIN = remote.getCurrentWindow()
const webix = require('./libs/webix.min.js')
$ = require('jquery')
webix.ui({
})
Em seguida, vamos digitar nossa interface. Por que acessar aqui designer.webix.com/welcome, clique no botão "Início rápido" e avance para o layout da interface. por exemplo, como mostrado na Figura 12.
Fig. 12 - Layout da interface no Webix Web Designer O layoutmostrado na Figura 12 é muito simples e consiste em arrastar e soltar o elemento desejado na área de trabalho do designer. A parte certa do construtor é para editar as propriedades dos elementos. Quando o layout estiver concluído (Fig. 13), você precisará transferi-lo para o arquivo renderer.js. Por que clicar no botão "Código" e obter um layout pronto na forma de texto. Selecione este texto e copie-o.
FIG. 13 - Converter layout em textoDepois disso, abrimos o arquivo “renderer.js” no “VSC” e colamos o texto copiado na função “webix.ui” preparada (Fig. 14).
const { remote } = require('electron')
let WIN = remote.getCurrentWindow()
const webix = require('./libs/webix.min.js')
$ = 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"
}
]
}
]
}
]
}
)
FIG. 14 - Adicionando um layout criado com o designerSuffer pouco mais. Em seguida, pegue e abra no “VSC” nosso arquivo index.html pré-preparado e anexe literalmente as três linhas a seguir :, e oarquivo index.html terá o seguinte formato:<!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>
Em seguida, clique em "F5" e obtenha nosso aplicativo com o layout do Webix (Fig. 15)
Fig. 15 - A janela de trabalho do aplicativo com layout da Webix
Adicione algumas fichas.
Tudo parece funcionar. Mas eu gostaria de remover a moldura da janela que não precisamos, que realmente não se encaixa no nosso design. Usaremos uma solução personalizada com você. Por que abrimos o arquivo “main.js” e adicionamos o parâmetro frame: false ao criar o BrowserWindow, esse sinalizador remove o menu padrão e a borda da janela. Deve ficar assim:const win = new BrowserWindow({
width: 800,
height: 600,
frame:false,
webPreferences: {
nodeIntegration: true
}
})
Clique em “F5” e veja o resultado sem uma janela de quadro (Fig. 16).
FIG. 16 - A janela de trabalho do aplicativo com layout da WebixResta ensinar a nossa janela a responder ao evento pelo mouse. No começo, ativaremos o título para que ele possa mover nossa janela pela tela do monitor. Por que abrir o arquivo “renderer.js”, localize o elemento view: label nele e adicione a propriedade css: ”head_win” a ele, como mostrado na Figura 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}
FIG. 17 - Adicionando um estilo à view: label elementAgora você precisa registrar esse estilo em um arquivo criado especificamente para esta finalidade. Abra o arquivo "style.css" e crie o seguinte estilo:.head_win {
-webkit-app-region: drag;
}
Depois disso, lançamos o aplicativo “F5” e tentamos arrastar nossa janela pelo título. Tudo deve funcionar.Por fim, nosso aplicativo responderá ao clicar nos botões de título da janela “-, +, x”. Por que adicionar o seguinte código ao final do arquivo 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();
}
})
Neste código, uma entrada no formato "$$ (" max-bt ")" significa acesso ao elemento "Webix" por seu "id". Portanto, é necessário que os botões do cabeçalho especifiquem esse ID no arquivo "renderer.js", o que faremos conforme mostrado na Figura 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" }
FIG. 18 - Adicionando um estilo à view: label elementIsso é tudo por enquanto. Experimente deve funcionar. O código fonte pode ser baixado no github, aqui está o link . Obrigado pela atenção.