Nos encanta RequireJS y AMD durante el desarrollo, donde podemos editar un módulo, presionar "volver a cargar" en nuestro navegador e inmediatamente ver el resultado. Pero cuando llega el momento de concatenar nuestros módulos en un único archivo para la implementación de producción, aparentemente tiene que haber un cargador AMD presente, ya sea que el cargador sea RequireJS o su socio menor "almond" como se explica aquí:¿Por qué los módulos concatenados RequireJS AMD necesitan un cargador?
http://requirejs.org/docs/faq-optimization.html#wrap
Mi confusión es: ¿por qué es necesario un cargador? A menos que tenga circunstancias inusuales que lo hagan necesario para hacer llamadas require()
dentro de sus módulos, parecería que una serie de módulos AMD podrían concatenarse sin un cargador presente. El ejemplo más simple posible sería un par de módulos como el siguiente.
ModA.js:
define([], function() {
return {a: 1};
});
ModB.js:
define(['ModA'], function(A) {
return {b : 2};
});
Dados estos dos módulos, parece que un concatenator podría producir simplemente el siguiente texto, y no una carga para el servidor de producción o navegador con el ancho de banda adicional o el cálculo requerido por RequireJS o Almond.
Me imagino a un concatenator que produce (y estoy usando Chevron-citas «» para mostrar donde los fragmentos de los dos módulos anteriores se han insertado):
Esto, por lo lejos que pueda ver, reproduciría correctamente la semántica de AMD, con un mínimo de pegamento extraño JavaScript. ¿Hay tal concatenación disponible? Si no, sería un tonto por pensar que debería escribir uno: ¿hay realmente muy pocas bases de código que consistan en módulos simples y limpios escritos con define()
y que nunca necesiten más llamadas al require()
que inicien más adelante búsquedas asíncronas de código?
¿Cómo resolvió este problema? Descubrí que al usar almendra, el archivo min es más grande por 3k que el archivo concatenado (9K vs 6K). – Naor