Javascript: hola mundo con Node.js

Javascript es uno de los lenguajes de programación más populares. Se pueden hacer aplicaciones para webs, de escritorio, para móviles, aplicaciones de servidor como microservicios o también aplicaciones de consola. Es un lenguaje de programación interpretado, no compilado, te permite OOP, y aunque sea imperativo, también permite la programación funcional.

Con todas estas cosas, a fecha de hoy, podemos programar en Javascript fuera de los navegadores gracias al entorno de ejecución de Node.js. Viene a ser lo mismo que el JRE para Java, el runtime de PHP, o el CLR del .NET framework.. pero en este caso es para Javascript. Este post es un sencillo howto o codekata para comenzar a usarlo.

Instalando la última versión estable de Node.js

Para esto podemos ir simplemente a la página https://nodejs.org/es/ y seguir las instrucciones.

En un Ubuntu compatible como es mi caso, podemos hacer lo siguiente para la versión 12 que es LTS a fecha de hoy:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt install -y nodejs

Hola mundo sencillo con Node.js

Ya con nodejs instalado no tenemos más que crear nuestros ficheros en Javascript para ejecutar lo que queramos. El clásico hola mundo para ejecutar en consola lo podemos escribir así en un fichero, que por ejemplo que se llame main.js:

console.log('Hello World!');

Y para ejecutarlo en línea de comandos, terminal o consola, como prefieras llamarla.. vamos a ella y ponemos:

node main.js

Veremos algo parecido a lo siguiente:

Ejecutando el hola mundo clásico en línea de comandos..

Un hola mundo algo más complejo

Si ponemos algunas funciones y un programa principal, podríamos seguir construyendo algo así:

function estoEsUnaPrueba(numero) {
    console.log('Hola mundo! Me has pasado por argumento el número ' + numero);
}

function main() {
    for (let index = 0; index < 100; index++) {
        estoEsUnaPrueba(index);
    }
}

main();

Que se ejecutaría igual:

node main.js

Y se vería por pantalla tal que así:

Separando en archivos el programa

Lo siguiente a un hola mundo es ir ampliando el programa, de forma que podamos dividirlo en ficheros distintos. Esto lo hacemos a base de los require y los exports. Es decir, con exports en un fichero especificamos qué vamos a exportar, y mediante require importamos lo que antes hemos exportado a un fichero para usarlo.

Por ejemplo, un fichero que representa un submodulo del programa y se llama submodule1.js podría ser:

const VAR1 = 'VALUE1';

function aFunction1() {
    console.log('Hola mundo 1!');
}

function aFunction2() {
    console.log('Hola mundo 2!');
}

const object1 = {
    main: function eMain() {
        for (let index = 0; index < 100; index++) {
            estoEsUnaPrueba(index);
        }
    }
}

exports.VARIABLE1 = VAR1;
exports.unaFuncion1 = aFunction1;
exports.unaFuncion2 = aFunction2;
exports.unObjeto = object1;

Podríamos hacer exactamente lo mismo mediante lo siguiente:

const VAR1 = 'VALUE1';

function aFunction1() {
    console.log('Hola mundo 1!');
}

function aFunction2() {
    console.log('Hola mundo 2!');
}

const object1 = {
    main: function eMain() {
        for (let index = 0; index < 100; index++) {
            estoEsUnaPrueba(index);
        }
    }
}

module.exports = {
    VARIABLE1 : VAR1,
    unaFuncion1 : aFunction1,
    unaFuncion2 : aFunction2,
    unObjeto : object1
};

Luego para usar el submodule1.js en el main tendríamos que hacer algo como lo siguiente:

const sub1 = require('./submodule1.js');

sub1.unaFuncion1();
sub1.unaFuncion2();
console.log('El valor de la variable es: ' + sub1.VARIABLE1);
console.log('El objeto cargado es: ', sub1.unObjeto);

El resultado de este programa de consola debe verse parecido a lo siguiente:

De esta misma forma, un módulo podrá cargar a su vez otros módulos.

Cargando módulos proporcionados por Node.js

Lo siguiente que vamos a pensar es ¿qué podemos hacer para no tener que construir desde cero, y avanzar lo más rápido posible? Tenemos una serie de módulos disponibles de la comunidad de desarrolladores, y las librerías proporcionadas por Node.js. De los módulos proporcionados por Node.js tenemos las siguientes para la versión 12:

https://nodejs.org/docs/latest-v12.x/api/

Estos módulos se importan a los ficheros igual que con el ejemplo anterior, mediante require. Tenemos disponibles módulos para utilidades en línea de comandos, para lanzar en paralelo procesos hijos, para hacer un servidor web, acceso a ficheros, acceso a cosas del sistema operativo, etc.. Por ejemplo, para ver en qué sistema operativo podríamos hacer:

const os = require('os');

console.log(os.platform());

Por ejemplo también para hacer una petición GET a un servidor web podríamos hacer:

const https = require('https');

https.get('https://jnjsite.com/aaaaaaa', (res) => {
    /*console.log(res);*/

    res.on('data', function (body) {
        console.log('BODY: ' + body);
    });
});

O también por ejemplo para crear un fichero podríamos hacer:

const fs = require('fs');

fs.writeFile('file.txt', 'Something..', (resp) => {
    if (resp) console.log('ERROR: ' + resp);
    else console.log('Write done!');
});

Cargando módulos externos mediante NPM

Llegados a este punto, aparte de los módulos que proporciona Node.js de casa, tenemos los que proporcionan la comunidad de desarrolladores. Tenemos una gran comunidad de desarrollo que se organiza en torno a NPM:

https://www.npmjs.com/

NPM es un gestor de packetes de software para nuestros proyectos Javascript. Es decir, igual que por ejemplo con Composer de PHP, con Javascript tenemos NPM. Podremos así instalar tanto para la web, como para Node.js, todo tipo de módulos a base de la línea de comandos y así haremos crecer nuestros programas en funcionalidad.

Inicializamos NPM así:

npm init

Seguimos las instrucciones y se creará un fichero package.json que contiene la configuración de paquetes Javascript para este proyecto:

{
  "name": "test-nodejs",
  "version": "1.0.0",
  "description": "Test project",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Jnj",
  "license": "ISC"
}

Si vamos a la web y nos registramos, podremos ver qué librerías son las más populares y hacer búsquedas para ver si ya está construido lo que necesitamos:

Muy importante comprender que NPM nos sirve tanto para Node.js como para el entorno de las páginas web. Por ejemplo, para una web, si quisiéramos usar jQuery, Bootstrap y Fontawesome, bastaría con poner lo siguiente desde el directorio principal del proyecto:

npm install jquery bootstrap fontawesome

Esto añade un directorio llamado /node_modules con lo necesario como la siguiente imagen:

VSCode añadiendo jQuery, Bootstrap y Fontawesome con Node.js..

Luego en la web bastaría con incluir los ficheros correspondientes en las etiquetas <link> y <script>, evitándonos buscar por internet y descargar nosotros los ficheros.

Hola mundo con Electron para Node.js

Ahora bien, lo mismo es para librerías de uso sólo con Node.js. Por ejemplo Visual Studio Code y Atom utilizan una librería de Node.js para hacer aplicaciones de escritorio multiplataforma llamada Electron. Si queremos instalarla para usar en nuestro proyecto, podemos hacer lo siguiente:

npm install electron

Si todo ha ido bien ya podemos usar electron igual que en los anteriores hola mundos. Por ejemplo, siguiendo la documentación de Electron de aquí: https://www.electronjs.org/docs podemos escribir un hola mundo para este programa de escritorio 100% escrito en Javascript, HTML y CSS..

Lanzando hola mundo con Electron, NPM y Node.js..

Un package.json que funciona es:

{
  "name": "test-nodejs",
  "version": "1.0.0",
  "description": "Test project",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "electron ."
  },
  "author": "Jnj",
  "license": "ISC",
  "dependencies": {
    "bootstrap": "^4.5.0",
    "electron": "^9.0.2",
    "fontawesome": "^5.6.3",
    "jquery": "^3.5.1"
  }
}

Mira que tiene que tener el comando “start” que arranque con “electron .” para que funcione. Entonces el main.js puede ser el de la documentación oficial:

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()
  }
})

Y el fichero index.html que carga como primera ventana puede ser:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Testing Electron</title>
</head>
<body>
    <h1>This is a test..</h1>
</body>
</html>

Sólo queda lanzar este hola mundo en Electron así con el comando: npm start

Los frameworks de desarrollo

El siguiente y último paso de este post, es que si has llegado hasta aquí, invitarte a probar paquetes NPM, librerías, frameworks de desarrollo. Te invito a probar y dejar un comentario aquí abajo 😉 Yo he visto muy interesante Express, Meteor.. ¿alguna sugerencia para probar?

¡Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *