2009-02-09 20 views
63

Estoy jugando con una aplicación web jquery bastante basada en ajax. Está llegando a un punto en el que casi pierdo la pista de los eventos que deberían desencadenar qué acciones, etc.¿Cómo estructurar mi código javascript/jquery?

Me queda algo así como la sensación de que mi estructura javascript es incorrecta, en un nivel más básico. ¿Cómo estructuran su código javascript/jquery, el manejo de eventos, etc.? Cualquier consejo para un desarrollador javascript novato.

Respuesta

33

AMDS!

Ha pasado un tiempo desde que se publicaron las primeras respuestas a esta pregunta y muchas cosas han cambiado. En primer lugar, el mundo del navegador JS parece moverse hacia AMD (definición de módulo asíncrono) para la organización del código.

La forma en que funciona es que escribir todo el código como módulos de AMD, por ejemplo:

define('moduleName', ['dependency1', 'dependency2'], function (dependency1, dependency2) { 
    /*This function will get triggered only after all dependency modules loaded*/ 
    var module = {/*whatever module object, can be any JS variable here really*/}; 
    return module; 
}); 

Y luego módulos conseguir cargado usando gestores de AMD como curl.js o require.js etc, para ejemplo:

curl(
    [ 
     'myApp/moduleA', 
     'myApp/moduleB' 
    ], 
).then(
    function success (A, B) { 
     // load myApp here! 
    }, 
    function failure (ex) { 
     alert('myApp didn't load. reason: ' + ex.message); 
    } 
); 

Las ventajas son:

  1. Solo tiene que incluir el elemento <script> en su página que carga el cargador AMD mismo (algunos de ellos son bastante pequeños).

  2. ¡Después de eso, todos los archivos JS se recuperarán automáticamente en BLOQUEO NO BLOQUEO asíncrono! moda, ¡así mucho más rápido!

  3. Los módulos necesarios se ejecutarán solo después de que se carguen sus dependencias.

  4. Modular (que significa código que es más fácil de mantener y reutilizar).

  5. La contaminación de variables globales puede frenarse completamente si se usa correctamente.

Sinceramente, una vez hecho clic en concepto tiene en su cabeza, que nunca volverá a sus viejas costumbres.

P.S: jQuery sí se registra como módulo AMD a partir de la versión 1.7.

Más información sobre AMDS:

+1

Impresionante, voy a ver esto para mi próximo proyecto. Muchas gracias por agregar a esta pregunta mucho más tarde. –

25

JavaScript código que encontraron los siguientes enlaces de Christian Heilmann indispensables

También me gusta mucho el método descrito por Peter Michaux here

para jQuery , Recomiendo encarecidamente leer las guías en Authoring y d me encontré con este tutorial en jQuery plugin patterns muy buena

+1

1 para recomendar el enlace de creación. Debo para novatos. – bendewey

+1

Me gusta el enlace de creación (que debo agradecerle), pero tengo que admitir que no soy un gran admirador de la manera en que los complementos de jQuery exponen los métodos públicos. Creo que el método de Christian para exponer un solo objeto público o los retornos públicos de Paul es más claro para leer. – Steerpike

+1

Christian me acaba de indicar otra opción para el módulo, aún más elegante: http://www.wait-till-i.com/2007/08/22/again-with-the-module-pattern-reveal-something -to-the-world/ –

1

archivos js Mis suelen seguir una convención de nomenclatura similar a esto:

  • xxx.utility.js
  • mypage.events.js
  • xxx. common.js
  • /lib/
  • /OS-DoNotDistribute/lib/

Dónde

  • 'mipágina' es el nombre del html, aspx, php, etc archivo.
  • 'xxx' es el concepto. (Es decir orders.common.js)
  • 'utilidad' significa que es una secuencia de comandos reutilizable biblioteca (es decir ajax.utility.js, controlfader.utility.js)
  • 'común' es la funcionalidad reutilizable para esta aplicación, pero no volver a usar en otros proyectos
  • 'lib' es un subdirectorio para las secuencias de comandos externos o biblioteca
  • 'OS-DoNotDistribute' es un subdirectorio para asegurar que ningún código con licencia del sistema operativo se distribuye si la aplicación es cada vez vendido.

Además, para ajax, tengo una convención de nomenclatura especial para las funciones de devolución de llamada, por lo que es fácil decir cuáles son.

No estoy seguro de que sea parecido a lo que estaba buscando, pero espero que ayude.

9

para mantener mis eventos en el control Yo uso una publicación/suscripción mecanismo

jQuery.subscribe = function(eventName, obj, method){ 
    $(window).bind(eventName, function() { 
     obj[method].apply(obj, Array.prototype.slice.call(arguments, 1)); 
    }); 
    return jQuery; 
} 

jQuery.publish = function(eventName){ 
    $(window).trigger(eventName, Array.prototype.slice.call(arguments, 1)); 
    return jQuery; 
} 

He aquí un ejemplo de su uso

// a couple of objects to work with 
var myObj = { 
    method1: function(arg) { 
     alert('myObj::method1 says: '+arg); 
    }, 
    method2: function(arg1, arg2) { 
     alert(arg1); 
     //republish 
     $.publish('anEventNameIMadeUp', arg2); 
    } 
} 

var myOtherObj = { 
    say: function(arg){ 
     alert('myOtherObj::say says: ' + arg); 
    } 
} 



// you can then have all your event connections in one place 

//myObj::method2 is now listening for the 'start' event 
$.subscribe('start', myObj, 'method2'); 

//myOtherObj::say is now listening for the 'another' event 
$.subscribe('anotherEvent', myOtherObj, 'say'); 

//myObj::method1 is now listening for the 'anEventNameIMadeUp' event 
$.subscribe('anEventNameIMadeUp', myObj, 'method1'); 
//so is myOtherObj::say 
$.subscribe('anEventNameIMadeUp', myOtherObj, 'say'); 


// ok, trigger some events (this could happen anywhere) 
$.publish('start', 'message1', 'message2'); 
$.publish('anotherEvent', 'another message'); 
+2

Mientras se activan los eventos de jQuery personalizados, debe considerar cuán lento es utilizar el DOM como su origen de eventos. Considere usar [un plugin de PubSub] (http://higginsforpresident.net/js/static/jq.pubsub.js) después de echar un vistazo a las [métricas en PubSub usando eventos de memoria frente a los eventos DOM de jQuery] (http: // weblog.bocoup.com/publishsubscribe-with-jquery-custom-events). –

2
(function($, window, slice) 
{ 

    $.subscribe = function(eventName, obj, method) 
    { 
     $(window).bind(eventName, function() 
     { 
      obj[method].apply(obj, slice.call(arguments, 1)); 
     }); 
     return $; 
    }; 

    $.publish = function(eventName) 
    { 
     $(window).trigger(eventName, slice.call(arguments, 1)); 
     return jQuery; 
    }; 

})(jQuery, window, Array.prototype.slice); 
+0

@Akzhan, ver los comentarios que publiqué en @meouw. El uso de eventos DOM es lento en comparación con una alternativa en memoria. –

2

Para añadir a las respuestas existentes, aquí hay un great post que cubre las técnicas más avanzadas que se basan en el modelo de módulo.

Una vez que su código Javascript alcanza cierto tamaño, inevitablemente querrá refactorizarlo dividiéndolo en múltiples archivos/módulos/submódulos. Si no está seguro de cómo lograr esto utilizando el patrón del módulo, este artículo es imprescindible.

0

Podemos usar el patrón mvc en nuestras aplicaciones javascript-jquery. (Backbone.js, knockout.js vs ....) son bibliotecas maduras que podemos usar para este objetivo.

Cuestiones relacionadas