Creando librerias que funcionen en Nodejs y el browser
En las últimas semanas me he dado a la tarea de migrar un par de librerías que tenemos en la chamba a Node para tener el mismo estilo de programación en el browser como en Node. Estas 2 librerías son Neon y Tellurium.
He descubierto que es un proceso sencillo y estaré buscando maneras de hacerlo más estético a como lo tengo ahora.
El primer paso para migrar una librería es incluir toda la librería en una función que sea invocada inmediatamente. Hay varios patrones para esto, chequen este link para más información sobre funciones invocadas inmediatamente.
Esto sucede para homogenizar el contexto global de los 2 ambientes. En el browser nos interesa trabajar con window y en node nos interesa trabajar con exports.
(function (global){
}(typeof window === 'undefined' ? exports : window));
El siguiente paso implica cargar todas las dependencias que utilizaremos en nuestras librerías, en este caso tenemos que hacerlo de manera distinta en el browser que en node. Por lo cual preguntaremos si existe require para cargar librerias en node de la siguiente manera
typeof require !== 'undefined'
Y en caso de no existir la función require, asumiremos que ya exiten las dependencias en nuestro browser. Como ejemplo está este código donde cargamos Neon en Tellurium
if(typeof require !== 'undefined'){
var Neon = require('./vendor/neon/neon.js');
var Module = Neon.Module;
var Class = Neon.Class;
var Interface = Neon.Interface;
}else{
var Module = global.Module;
var Class = global.Class;
var Interface = global.Interface;
}
El último paso es exponer nuestra libería al ambiente global para que pueda ser usada por otros módulos.
global.Tellurium = Tellurium;
Como parte de mis futuros experimentos para realizar esto, se incluye checar correr requirejs en node y probar cómo funciona. Para más información chequen este artículo.
Les informaré como me va.