Así como tenemos Módulos en NodeJS, también los podemos tener en el cliente usando RequireJS.
RequireJS es una librería basada en la especificación de CommonJS para Módulos la cual nos trae una implementación para cargar módulos del lado del cliente. Esto nos permite mantener nuestro código limpio y en una suerte de “carga en demanda”, ya que se pueden definir dependencias.

También tiene optimizaciones para los scripts, por ej. unificación y compresión para el deploy (por el momento solo para NodeJS y Java).

Veamos un ejemplo simple de como utilizarla y que en que nos ayuda:

root/
  index.html
  scripts/
    main.js
    utils.js
    pepe.js
 
<!DOCTYPE html>
<html>
  <head>
    <title>Sin RequireJS</title>
    <!-- agrego mi coqueto script main.js-->
    <script type="text/javascript" src="scripts/main.js"></script>

    <!-- main.js tiene una dependencia a utils.js, asi que lo agrego -->
    <script type="text/javascript" src="scripts/utils.js"></script>

    <!-- Pero utils.js tiene una dependencia a pepe.js, lo agrego -->
    <script type="text/javascript" src="scripts/pepe.js"></script>

    <!-- Espero no olvidarme de otro script porque explota en colores -->
  &lt;/head&gt;
  &lt;body&gt;
  &lt;/body&gt;
&lt;/html&gt;
 

Lo anterior está un poquito inflado, pero es algo bastante común. Por lo general tenemos un layout o master-page donde metemos la mayoria de scripts, pero asi y todo, tenemos que pensar en dependencias, que scripts antes de cual, etc… (en el caso anterior debería cambiar el orden exactamente alreves :P)

Con RequireJS sería algo de este estilo:

Agregamos a nuestro directorio require.js

root/
  index.html
  scripts/
    require.js
    main.js
    utils.js
    pepe.js
 
<!DOCTYPE html>
<html>
  <head>
    <title>Con RequireJS</title>
    <!-- agrego la referencia a require.js y con data-main 
     le digo que quiero que cargue cuando termine require.js -->
    <script data-main="scripts/main" src="scripts/require.js"></script>
  </head>
  <body>
  </body>
</html>
 
// le digo a requireJS que voy a necesitar util.js para trabjar en main

require(["util"], function(util) {
  // este callback se dispara cuando util.js fue cargado, pero no 

  // solo util.js, sino tambien cuando sus dependencias se cargaron.

}
 
// defino util.js como módulo y que tiene una dependencia a pepe.js,

// también puedo especificar mas de una dependencia, por ej jose.js.

define(["pepe", "jose"], function(pepe, jose) {
   return {
     color: 'azul'
   };
}
 
// defino pepe.js como módulo

define(function() {
  //puedo ejecutar alguna configuracion inicial del módulo,

  // y retornar sus accesos con un simple objeto

  return {
    getAlgo: function(){
      return "algo";
    }    
  };   
}
 

Bastante mas ordenado, no?. Lo interesante es que no necesito preocuparme en el html de las dependendencias que tiene cada script, ni el orden, ni siquiera acordarme de agregar todos los utilizados. Simplemente referencio en cada script sus dependencias y RequireJS se encarga de lo restante.

Para jQuery varia mínimamente su uso, si están utilizando jQuery vean la implementación aca