¿Cómo compartir código entre Node.js y el navegador?

En este artículo, exploraremos cómo escribir módulos de JavaScript que puedan ser utilizados tanto por las aplicaciones del lado del cliente como del lado del servidor.
Tenemos una pequeña aplicación web con un cliente JavaScript (que se ejecuta en el navegador) y un servidor Node.js que se comunica con él. Y tenemos una función getFrequency() que debe ser utilizada tanto por el servidor como por el cliente para obtener la frecuencia de los caracteres en una string dada. Queremos crear un conjunto único de métodos que puedan facilitar la tarea en ambos extremos.
Enfoque: 
Escribir código para el lado del cliente (que se ejecuta en el navegador) difiere mucho de la aplicación Node.js del lado del servidor. En el lado del cliente, tratamos principalmente con DOM o API web como cookies, pero estas cosas no existen en Node. Otras razones por las que no podemos usar módulos de Node en el lado del cliente es que el Node usa elSistema de módulos CommonJS , mientras que el navegador utiliza módulos ES estándar que tienen una sintaxis diferente.
En el Node, usamos module.exports para exponer la funcionalidad o la propiedad. Sin embargo, esto fallará en el navegador, ya que el navegador no puede reconocer las exportaciones . Entonces, para que funcione, verificamos si las exportaciones están definidas, si no, creamos un objeto sensible para exportar funciones. En el navegador, esto se puede lograr creando una variable global que tenga el mismo nombre que el del módulo.
La estructura del módulo será similar a la siguiente: 
sampleModule.js 
 

javascript

// Checking if exports is defined
if(typeof exports === 'undefined'){
   var exports = this['sampleModule'] = {};
}
  
// The code define the functions,
// variables or object to expose as
// exports.variableName
// exports.functionName
// exports.ObjectName
  
// Function not to expose
function notToExport(){ }
  
// Function to be exposed
exports.test(){ }

El formato anterior tiene el problema de que todo lo que definamos en sampleModule.js pero que no se exporte estará disponible para el navegador, es decir, tanto la función notToExport() como test() funcionarán fuera de este archivo. Entonces, para superar esto, envolvemos el módulo en un cierre.
sampleModule.js 
 

javascript

(function(exports) {
    
   // The code defines all the functions,
   // variables or object to expose as:
   // exports.variableName
   // exports.functionName
   // exports.ObjectName
  
}) (typeof exports === 'undefined'? this['sampleModule']={}: exports);

Ejemplo: Hagamos un módulo de muestra que contenga un método ‘getFrequency’ para contar la frecuencia de caracteres en una string. 
 

  • módulocompartido.js 
     

javascript

// All the code in this module is
// enclosed in closure
(function(exports) {
  
    // Helper function
    function toLC(str) {
        return str.trim().toLowerCase();
    }
  
    // Function to be exposed
    function getFrequency(str) {
        str = toLC(str);
        var freq = [];
        for(var i = 0; i < 26; i++) {
            freq.push(0);
        }
  
        for(var i = 0; i < str.length; i++) {
            freq[str.charCodeAt(i)-97]++;
        }
        return freq;
    }
  
    // Export the function to exports
    // In node.js this will be exports
    // the module.exports
    // In browser this will be function in
    // the global object sharedModule
    exports.getFrequency = getFrequency;
      
})(typeof exports === 'undefined'?
            this['sharedModule']={}: exports);
  • nodeApp.js 
     

javascript

// Simple node.js script which uses sharedModule.js
  
// Get module.exports of sharedModule
const utilities = require('./sharedModule');
  
// Print frequency of character
console.log(utilities.getFrequency("GeeksForGeeks"));
  • clientApp.js 
     

javascript

// Use functionality getFrequency which
// is available in sharedModule object
document.write(this.sharedModule.getFrequency("GeeksForGeeks"));
  • índice.html 
     

html

<script src="./sharedModule.js"></script>
<script src="./clientApp.js"></script>

Pasos para ejecutar el programa: 
 

  • Copie y pegue todo el código con sus respectivos nombres de archivo y asegúrese de que todos los archivos estén en el mismo directorio.
  • Abra la terminal en el mismo directorio y ejecute ‘node nodeApp.js’ .
  • Abra index.html en cualquier navegador.

Producción: 
 

  • Salida en la consola node.js: 
     
[ 0, 0, 0, 0, 4, 1, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0 ]
  • Salida en el navegador: 
     

Publicación traducida automáticamente

Artículo escrito por Vinod Tahelyani y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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