¿Cuál es la mejor manera de usar el código JavaScript tanto en el navegador como en Node.js?

Directamente desde el excelente código fuente de Backbone.js. Backbone es una de las bibliotecas de JavaScript modernas más populares, utilizada por personas como USA Today, Hulu, DocumentCloud, Walmart Mobile y más. Te alegrará saber que no hay necesidad de utilizar RequireJS ni ninguna otra herramienta AMD.

Toda la biblioteca Backbone se define en una declaración de función invocada de inmediato:

  (función () {
   ...
 }).llama esto);

Primero, establece una referencia a la window o a las exports .

  // Guardar una referencia al objeto global (`ventana` en el navegador,` exportaciones` 
 // en el servidor). 
 raíz var = esto;

A continuación, establece el espacio de nombres de nivel superior de la aplicación, verificando si está en el navegador o en el nodo.

  // El espacio de nombres de nivel superior.  Todas las clases y módulos públicos de Backbone serán 
 // se adjuntará a esto.  Exportado tanto para el navegador como para el servidor. 
 Var Backbone; 
 if (tipo de exportaciones! == 'indefinido') { 
 Backbone = exportaciones; 
 } más { 
 Backbone = root.Backbone = {}; 
 }

Tenga en cuenta que también requiere otras bibliotecas (en este caso underscore.js) de forma cruzada:

  // Requiere subrayado, si estamos en el servidor, y aún no está presente. 
 var _ = root._; 
 if (! _ && (typeof require! == 'undefined')) _ = require ('subrayado');

Aquí hay una variante de patrón de definición de módulo específico que me gusta usar, que funciona tanto en el navegador como en node.js:

 (function () { // Make a module var myModule = (function (name) { var root = typeof window !== 'undefined' ? window : global, had = Object.prototype.hasOwnProperty.call(root, name), prev = root[name], me = root[name] = {}; if (typeof module !== 'undefined' && module.exports) { module.exports = me; } me.noConflict = function () { root[name] = had ? prev : undefined; if (!had) { try { delete root[name]; } catch (ex) { } } return this; }; return me; }('myModule')); // Attach methods to myModule... myModule.foo = function () { // ... }; }()); 

Evita hacer referencia directa a los globales que pueden o no existir, dependiendo del entorno de ejecución, al optar por la verificación segura “typeof X! == ‘undefined'”.

También es bueno porque las primeras líneas son prácticamente repetitivas y se pueden copiar y pegar fácilmente en nuevos módulos.

Crea una referencia global al módulo, pero también implementa .noConflict () para que pueda eliminar fácilmente la referencia global para coexistir pacíficamente con cualquier código preexistente.

DEPENDER