¿Por qué se dice que CommonJS solo es adecuado para aplicaciones que no son de navegador?


¿Por qué no usarlo como un patrón de componente general para Javascript, incluido Javascript ejecutado por el navegador?

De un vistazo, parece ser una buena manera de modular 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í.

Author: Jonathan, 2011-01-23

1 answers

CommonJS es definitivamente adecuado para el navegador, con algunas advertencias. El patrón del módulo CommonJS es bastante agradable (en mi opinión sesgada), y también es un buen paso hacia el sistema de módulos propuesto para ECMAScript Harmony (la próxima versión planificada del lenguaje JavaScript). Específicamente, los módulos Harmony no tendrán acceso al objeto global ("window").

La razón por la que algunas personas afirman que los módulos CommonJS no son adecuados para el navegador es que no se pueden cargar a través de un etiqueta

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 algunas razones (el ámbito no está envuelto, por lo que convertToHTML se adjuntaría a window, require no se definiría normalmente y las exportaciones deben crearse por separado para cada módulo).

Una biblioteca del lado del cliente con un poco de lado del servidor la ayuda podría permitir que esto se cargue fácilmente a través de etiquetas de script. O bien, una biblioteca del lado del cliente que cargue el script a través de XMLHttpRequest y haga una eval() 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 del 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 añadir ese bit define() alrededor del módulo. (Probablemente podría hacer que un servidor lo haga muy fácilmente también, por lo que ni siquiera necesita escribir manualmente la parte de definición).

He utilizado personalmente RequireJS en un par de proyectos ahora y me parece 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 excelente manera de hacerlo.

(ObDisclaimer: Empecé el proyecto CommonJS, así que estoy claramente sesgar.)

 72
Author: Kevin Dangoor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-24 04:39:41