Contenido

El sistema de módulos de Node.js

El sistema de módulos utilizado actualmente en Node.js extiende del estándar de CommonJS, aunque hay que destacar que se están implementando otras soluciones como los módulos de ES. Sin embargo, al principio este vacío no estaba cubierto y CommonJS fue quien lo lleno.

¿Qué es un módulo?

Un módulo no es nada más que una unidad de código organizado en archivos o directorios, la cual puede ser exportada con facilidad para poder reutilizarse en otras partes de la aplicación.

Tipos de módulos

Hay 3 tipos de módulos. Todos funcionan de una manera similar pero difieren en el origen.

  • Built-in modules: Son los módulos nativos de la API de Node.js. No hace falta que se instalen, ya que vienen incluidos por defecto con Node.js. Algunos ejemplos son los módulos fs o stream. Estos paquetes solo son actualizados si cambias la versión de Node.js.
  • Local modules: Son los módulos escritos por los desarrolladores y forman en su conjunto gran parte de la aplicación. Como ya has leído, se estructuran así con la finalidad de poder ser un código reutilizable.
  • External modules: Son, en esencia, los paquetes de terceros distribuidos a través de npm (aunque pueden provenir de otros repositorios). Estos paquetes se instalan como dependencias y, aunque aportan funcionalidad a la aplicación, no deben incluirse en el repositorio ya que no son parte de la misma.

¿Como funciona?

En Node.js cada archivo cuenta con un objeto global llamado module. Su estructura es bastante sencilla:

`` Module { id: ‘.', path: ‘/Users/mac/Desktop/examples’, exports: {}, parent: null, filename: ‘/Users/mac/Desktop/examples/index.js’, loaded: false, children: [], paths: [ ‘/Users/mac/Desktop/examples/node_modules’, ‘/Users/mac/Desktop/node_modules’, ‘/Users/mac/Desktop/node_modules’, ‘/Users/mac/node_modules’, ‘/Users/node_modules’, ‘/node_modules’ ] }

``

Hay cierta información que puede ser relevante en algún momento determinado pero por lo general no usarás con frecuencia. La propiedad clave en el objeto Module es exports, la cual te permitirá exportar código para ser reutilizado con posterioridad en tantos sitios como sea necesario.

Exportando código: exports.

Existen hasta 3 tipos de nomenclaturas que puedes utilizar para exportar código a través de un módulo:

  1. Exportar directamente un método function add = function (a, b) { return a + b; } module.exports = add;

  2. Exportar un objeto con diferentes métodos function add = function (a, b) { return a + b; } function multiply = function (a, b) { return a * b; } module.exports = { add, multiply, };

  3. En combinación con la anterior, utilizar exports (es un alias de module.exports) y asignar directamente métodos a nuevas propiedades del objeto. exports.add = function (a, b) { return a + b; } exports.multiply = function (a, b) { return a * b; }

¡Ojo! puedes usar module.exports o exports a tu gusto. Pero es importante que no los combines dentro de un mismo fichero pues tendrás problemas con referencias y no se exportará el código correctamente.

Importando código: require.

Llegados a este punto, ya sabes como exportar código. Pero de nada sirve si no puedes importarlo en otra parte de tu aplicación. Para esta finalidad cuentas con el método require.

Existen dos casuísticas para usar require:

  1. Módulos built-in o external: Únicamente debés pasar como argumento un string con el nombre del módulo. Para el caso de built-in deben encontrarse instalados en la carpeta node_modules. Para el caso de paquetes de API de node no es necesario anda adicional.

const fs = require('fs'); // Built-in const lodash = require('lodash'); // Paquete externo

  1. Módulos locales: Se pasa como argumento un string con la ruta relativa del fichero del módulo. Si el argumento es un directorio, por defecto buscará un archivo denominado index.js para poder importar el módulo. En el caso de no existir dicho fichero, el módulo se importará como undefined.

const myPhoneUtil = require('../utils/parse-phone.js');