Cómo usar mi propia versión de jQuery con módulos navegadores

(Debo aclarar por adelantado: mi pregunta es acerca de los cierres y los patrones del módulo del cliente en Javascript. No se trata de cómo usar jQuery.noConflict ()).

Tengo un poco de Javascript que la gente puede agregar a sus sitios web. Quiero que mi propio código tenga acceso a una variable $ que se resuelve en una versión específica de jQuery que es independiente de lo que haya cargado la página. Esto es fácil si todo mi código está en un solo archivo, dentro de un cierre que defino. Pero estoy luchando por encontrar una manera limpia de hacer esto usando un patrón de módulo donde mi código está en cierres separados.

Antecedentes (es decir, lo obvio queno es el problema)

Esto fue fácil cuando todo mi código estaba en un archivo. Simplemente podría crear un $ var dentro de mi cierre más externo y usar $ .noConflict (...) para asegurarme de que la página externa mantenga su propia versión de jQuery. Algo como esto:

// This is easy and works as you'd expect
(function() {

    var $; // The $ var in my local scope that the rest of my code can use.

    function loadMyVersionOfjQuery() {
        insertTheAppropriateScriptTagAndWaitForTheScriptToLoad(function() {
            // Set the $ in my local scope and restore the global jQuery.
            $ = jQuery.noConflict(true);
        }
    }

    loadMyVersionOfjQuery();

    ... etc. ...
})();

Ahora estoy en el proceso de dividir mi código en archivos separados usando browserify y esto ya no es tan fácil. El mayor problema proviene del hecho de que mi versión de jQuery se carga de forma asincrónica. Entonces, en el momento en que mi módulo requiere () se están procesando, mi versión de jQuery no está lista. Esto me impide simplemente crear y asignar $ var en el nivel superior de los cierres de mis módulos.

Algunas ideas que he investigado

Si pudiera diferir la inicialización de mis módulos hasta después de ejecutar jQuery, entonces cada uno de mis módulos podría definir sus propios $ var. Pero esto no parece posible. Parece que mis llamadas requeridas (...) se cruzan agresivamente incluso si trato de ocultarlas dentro de las devoluciones de llamada de función (browserify parece analizar el JS para encontrar las declaraciones requeridas).Si pudiera definir un objeto proxy dinámico, podría inicializar mis propios $ vars con un proxy que luego delegaría en mi versión cargada de jQuery. Pero Javascript no admite el patrón de proxy dinámico.Browserify en realidad define un cierre que envuelve todos mis módulos cuando están "transpilados" en un solo archivo. Si de alguna manera pudiera darle un fragmento de código para insertar en este cierre (simplemente "var $;"), estaría en el negocio. Pero no he encontrado ninguna manera de hacer esto.Como último recurso, se me ocurrió que podría crear mi propio cierre alrededor de la salida del navegador y definir la variable de ámbito que necesito allí. Al procesar el archivo de salida o al realizar una concatenación hacky de un par de archivos simples alrededor del contenido del navegador (algo así como "(function () {var $;" + bundle.js + "}) ();". Pero esto es Demasiado hacky.

¿Alguien tiene alguna idea? ¿Cómo se desarrollan los módulos Javascript del cliente en varios archivos pero aún así se cierra todo el código?

Respuestas a la pregunta(2)

Su respuesta a la pregunta