NodeGUI
Tags: uidesign, qt, node
Published: 2020-01-26 00:53:51

---
title: NodeGUI
published: true
date: 2019-11-17 18:30:13 UTC
tags: ui-design,qt,node,nodejs
canonical_url: https://medium.com/@alexmarket/nodegui-c8b8c9c81ba1
---

Una alternativa al desarrollo de interfaces gráficas (GUI) en el ecosistema NodeJS.

![](https://cdn-images-1.medium.com/max/1024/1*-3eLQ-pSkBf-kKJLNtvykA.png)<figcaption><a href="https://nodegui.github.io/">https://nodegui.github.io</a></figcaption>

NodeGUI es básicamente una vinculación nativa de JavaScript para QT. QT es entorno de desarrollo de plataforma cruzada hecho en C++ para aplicaciones de escritorio, web y móviles y otros.

NodeGUI tiene todo el poder de Qt5 💚 el cual lo hace muy eficiente en cuanto a CPU y memoria sobre todo si se compara con otras soluciones basadas en [chromium](https://es.wikipedia.org/wiki/Chromium_(navegador)) como [electron](https://electronjs.org/).

### Las aplicaciones basadas en Electron son pesadas.

Pues esa es la mayor critica a Electron — [main criticism levelled at Electron apps](https://news.ycombinator.com/item?id=12119278), que están super hinchadas y requieren mucha memoria. Estos es porque cada app de Electron se entrega con una versión del navegador [Chromium](https://www.chromium.org/Home) y no esta en una posición de compartir recursos, como las apps nativas hacen.

![](https://cdn-images-1.medium.com/max/1024/1*Kt9YsGFcHSx1LsaLWBH_SQ.png)<figcaption>Logo de QT</figcaption>

La compañía **Qt** (antes **Trolltech** ) es una compañía de software fundada en Espoo, Finlandia, desde donde supervisa el desarrollo de su framework de aplicaciones Qt, siendo este un entorno de trabajo multi plataforma para la creación de interfaces gráficas (GUI) escrito en C++ como ya habíamos mencionado, pero es soportado con enlaces a otros lenguajes de programación como Python, Lua, etc y ¡si! recientemente JavaScript.

#### Nota curiosa

KDE el escritorio de linux, en su versión denominada plasma, esta desarrollada con Qt.

![](https://cdn-images-1.medium.com/max/1024/1*tbpGhNa0lEaaXMZI118sPA.jpeg)<figcaption>KDE Plasma esta desarrollado con Qt.</figcaption>

Los enlaces (bindings) nativos de JavaScript son escritos usando N-API o _node addon api_. N-API es una API para construir complementos nativos, para mayor referencia pueden revisar la documentación, dando [click aquí](https://nodejs.org/api/n-api.html). esto significa que las aplicaciones escritas usando NodeGUI no se despliegan en una instancia del navegador y dibujan la UI en este, en lugar de eso todos los widgets son dibujados nativamente.

Ya que NodeGUI es un complemento nativo de NodeJS, es decir extiende NodeJS tenemos acceso completo a todas las APIs de Node y a todos los módulos npm compatibles. Y también por supuesto las herramientas de depuración que usamos con NodeJS podemos usarlas con NodeGUI ¿fantástico no?

Otra ventaja de usar de usar Qt es que esta tiene un API para poder definir los estilos de nuestros widgets via CSS y el soporte de Flex Box a las hojas de estilo de Qt se añadió usando [Yoga](https://yogalayout.com/), entonces pues tenemos soporte en Qt para pintar y definir propiedades de layout via CSS.

#### Mucho ruido y pocas nueces.

```
git clone https://github.com/nodegui/nodegui-starter
cd nodegui-starter
npm install
npm run build
npm start
```

Ooops. Me mando un error al momento de instalar.

![](https://cdn-images-1.medium.com/max/1024/1*CmzOdCb4D8GO0x7S5EJXew.png)<figcaption>error</figcaption>

Parece que falta instalar la librería y la dependencia C make.

```
_npm i @nodegui/nodegui_
```

#### holamundo.js con Qt

En nuestro editor favorito

```
const {
  QMainWindow,
  QWidget,
  QLabel,
  FlexLayout
} = require("@nodegui/nodegui");

const win = new QMainWindow();

const centralWidget = new QWidget();
centralWidget.setObjectName("myroot");
const rootLayout = new FlexLayout();
centralWidget.setLayout(rootLayout);

const label = new QLabel();
label.setObjectName("mylabel");
label.setText("Hello");

const label2 = new QLabel();
label2.setText("World");
label2.setInlineStyle(`
  color: red;
`);

rootLayout.addWidget(label);
rootLayout.addWidget(label2);
win.setCentralWidget(centralWidget);
win.setStyleSheet(
  `
    #myroot {
      background-color: #009688;
      height: '100%';
      align-items: 'center';
      justify-content: 'center';
    }
    #mylabel {
      font-size: 16px;
      font-weight: bold;
    }
  `
);
win.show();

(global as any).win = win; //to prevent gc
```

![](https://cdn-images-1.medium.com/max/200/1*_H3XmAgntJwfJupZ1tNagQ.png)<figcaption>Bonito ¿no?</figcaption>

#### Conclusión

Me queda la duda de si realmente QT será una opción para el desarrollo de UIs en Node. No me queda duda de que Qt es una gran herramienta y de que el sistema NodeJS cada vez crece más. A pesar de que NodeGUI esta en desarrollo constante, el proyecto aún esta en su infancia y el equipo que lleva este recomienda no usarlo en producción todavía.

Nos leemos. Alex