practices - pattern javascript example
¿Por qué se dice que CommonJS es adecuado para aplicaciones que no son de navegador? (1)
CommonJS es definitivamente adecuado para el navegador, con algunas advertencias. El patrón del módulo CommonJS es bastante bueno (en mi opinión sesgada), y también es un buen trampolín para el sistema de módulos propuesto para ECMAScript Harmony (el próximo lanzamiento planificado del lenguaje JavaScript). Específicamente, los módulos Harmony no tendrán acceso al objeto global ("ventana").
La razón por la que algunas personas afirman que los módulos de CommonJS no son adecuados para el navegador es que no se pueden cargar a través de una etiqueta <script> sin asistencia del lado del servidor. Por ejemplo, imagine que tiene una biblioteca de descuentos que exporta una función "convertToHTML". A continuación, puede crear un módulo que se vea así:
var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
// do something then call convertToHTML
}
Esto no funciona a través de una etiqueta de script por varias razones (el alcance no está ajustado, por lo que convertir aHTML se adjuntaría a la ventana, requerir normalmente no se define y las necesidades de exportación se crean por separado para cada módulo).
Una biblioteca del lado del cliente con un poco de ayuda del lado del servidor podría permitir que esto se cargue a través de etiquetas de script fácilmente. O bien, una biblioteca del lado del cliente que carga la secuencia de comandos a través de XMLHttpRequest y una evaluación () también funcionaría, aunque la experiencia de depuración a menudo no es tan buena.
Una solución bastante razonable en este momento, aunque también es objeto de un debate contencioso entre los miembros de CommonJS, es RequireJS . Usando RequireJS, puedes escribir tu módulo así:
define(function(require, exports, module) {
var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
// do something then call convertToHTML
}
});
Todo lo que hicimos fue agregar ese bit de definición () alrededor del módulo. (Es probable que también haga que un servidor lo haga con bastante facilidad, de modo que ni siquiera necesite escribir manualmente la parte de definición).
Personalmente, he usado RequireJS en un par de proyectos ahora y encuentro una manera fácil de hacer uso de módulos CommonJS sin un bit del lado del servidor. Hay muchas otras soluciones y si no depende de ejecutar archivos JS estáticos, los módulos CommonJS estándar son una gran manera de hacerlo.
(ObDisclaimer: comencé el proyecto CommonJS, así que estoy claramente predispuesto).
¿Por qué no usarlo como un patrón de componentes generales para Javascript, incluido el Javascript ejecutado por el navegador?
A primera vista, parece ser una buena forma de modularizar el proyecto en el que estoy trabajando actualmente, que consiste en una gran base de código Javascript, con muchos componentes, algunos de los cuales interactúan entre sí.