Skip to content

Construcción básica de módulos en JavaScript

La utilización de módulos en JavaScript es una de las maneras más eficientes de reutilizar nuestro código y al mismo tiempo de hacerlo lo más portable posible para su consumo en distintas partes de nuestro aplicativo o librería. Un módulo no es más que encapsular un bloque de funciones y atributos y exponerlo tal como si se tratar de una API para quien hace uso del mismo.

Para entenderlo mejor, definamos las diferentes partes que interactuan acá. Empecemos por definir una función:

function miFuncion(param1, param2) {
    // Contenido de mi función
}

Una función es la forma mas sencilla de encapsular un pequeño bloque de código. Sin embargo un aplicativo hace uso de cientos, incluso miles de ellas para alcanzar la funcionalidad deseada por sus creadores y es por lo tanto necesario un mecanismo que nos permita agrupar funciones afines en una estructura que nos permita fácil acceso a las mismas. Es acá donde un módulo empieza a cobrar sentido.

Un módulo lo podemos definir en su forma mas básica de la siguiente manera:

(function miModulo() {
    function miPrimeraFuncion(param1) {
        // Contenido de la función
    };

    function miSegundaFuncion(param2) {
        // Contenido de la segunda función
    }

    return {
        miPrimeraFuncion: miPrimeraFuncion,
        miSegundaFuncion: miSegundaFuncion
    }
})();

Visto de esta forma es fácil darnos cuenta que un módulo es realmente una función que contiene más funciones. Para hacer uso de las funciones que contiene un módulo es tan fácil como instanciarlo desde donde se le va a consumir y acceder a las funciones que se exponen mediante el return al final del mismo.

// Importamos nuestro módulo desde su ubicación
var modulo = require("/ruta/hacia/mi/modulo");

// Accedemos a las funciones de nuestro módulo utilizando la instancia creada
var resultadoFuncion1 = modulo.miPrimeraFuncion("xyz");
var resultadoFuncion2 = modulo.miSegundaFuncion(123);

Uno de los temas vitales de encapsular funciones y bloques de código que se relacionan en un módulo es el poder exponer únicamente las funciones y variables que se desean hacer disponibles a quien consume el módulo y mantener todo lo demás como privado y para uso interno de las demás funciones del módulo. Acá un ejemplo:

(function miModulo() {
    function miPrimeraFuncion(param1) {
        // Contenido de la función
    };

    function miSegundaFuncion(param2) {
        var resultado = miFuncionPrivada(param2);
        return resultado;
    }

    function miFuncionPrivada(parametro) {
        // Contenido de la función privada
    }

    return {
        miPrimeraFuncion: miPrimeraFuncion,
        miSegundaFuncion: miSegundaFuncion
    }
})();

Hemos modificado nuestro módulo original y hemos agregado una función llamada miFuncionPrivada, la cual podemos ver que es usada por miSegundaFuncion para llenar una variable llamada resultado. Esto es totalmente válido y JavaScript nos permite utilizar cualquier función que se encuentre dentro del mismo alcance de la función que estamos utilizando. Todas las variables declaradas dentro del módulo representan un mismo alcance, lo que significa que todas ellas pueden hacer uso de cualquier variable o función dentro del mismo alcance. Sin embargo en el momento en que este módulo es instanciado desde fuera entra a jugar un alcance diferente y quien está consumiendo esta instancia únicamente puede ver y tener acceso a las funciones y / o variables que hemos decidido hacer accesibles mediante el return del módulo.

Intentar hacer esto con una instancia del módulo resultará en un error:

// Importamos nuestro módulo desde su ubicación
var modulo = require("/ruta/hacia/mi/modulo");

// Accedemos a las funciones de nuestro módulo utilizando la instancia creada
var resultadoFuncion1 = modulo.miPrimeraFuncion("xyz");
var resultadoFuncion2 = modulo.miSegundaFuncion(123);
var resultadoFuncionPrivada = modulo.miFuncionPrivada("xyz");

Intentar llamar una función que no está visible para quien consume el módulo hará que nuestro código arroje un error. Si bien en este ejemplo dicha función se invoca de manera implícita como parte de la ejecución en la llamada a miSegundaFuncion, invocar directamente dicha función privada no es posible. Esto funciona de igual manera con variables declaradas internamente en el módulo, no es posible acceder a las mismas desde afuera.

Acá no hemos hecho más que rascar la superficie. JavaScript es un lenguaje muy versátil que es muy fácil de aprender pero muy difícil de dominar. El paradigma de módulos es una de las tantas herramientas que un desarrollador debe tener en su caja de herramientas y con la suficiente experiencia y dedicación permite que escalemos la complejidad de nuestros aplicativos de manera controlada y sencilla.

Published inDesarrolloTutorial