2013-02-15 2 views
6

Ich habe begonnen, requirjs Kontexte als eine Möglichkeit zu verwenden, eine große einseitige Anwendung zu partitionieren, die aus einzelnen Stand-Alone-SPAs besteht, die ihre eigenen Abhängigkeiten haben.Eine Praxis für die Handhabung gemeinsamer Abhängigkeiten zwischen mehreren Requirejs Kontexte?

James Burke beschreibt das Problem, dass ich jetzt in diesem Kommentar auf Github über mehrere Kontexte und ihre gemeinsamen Abhängigkeiten bin Begegnung nicht mit anderen geteilt werden, https://github.com/aurajs/aura/pull/170#issuecomment-10973485

wie ich, ohne dass doppelten Anforderungen gemeinsame Abhängigkeiten zwischen verschiedenen requirejs Kontexten tun teilen für die gleiche Datei?

+0

ich das gleiche Problem ... Ich löste es irgendwie durch Verweise auf die gemeinsamen Module injizieren, wenn ich jede App zu initialisieren, aber es wäre toll, wenn wir andere Kontexte aus einem anderen Kontext haben könnten. – chchrist

+1

Das Problem könnte durch das Schreiben eines require.js Plugins gelöst werden, um Kontexte zu verwalten, das Plugin könnte bestimmen, ob eine Abhängigkeit aus einem globalen Kontext gezogen werden kann, um mehrere zu vermeiden Anfragen für die gleiche Abhängigkeit. Bislang gibt es dafür keine Antwort, da es keine Open-Source-Lösungen gibt. Siehe http://requirejs.org/docs/plugins.html –

+1

Verwenden Sie browserify: https://github.com/substack/node-browserify/ – avetisk

Antwort

0

Sie können nach browserify zum Packen von großen Multi-Modul-Js-Anwendungen suchen.

1

Ich stieß auf das gleiche Problem, das Sie beschrieben haben. Ich habe ein Plugin geschrieben, das sich um gemeinsame Abhängigkeiten zwischen verschachtelten Kontexten kümmert.

Requirejs hat eine Karte, die alle Kontexte enthält und es Abhängigkeiten definiert:

requirejs.s.contexts

{ 
    _: { 
    defined: { 
     commondep: {}, 
     main: undefined 
    } 
    } 
    plugin: { 
    defined: { 
     commondep: {}, 
     plugin: {} 
    } 
    } 
} 

Der _ Kontext ist der wichtigste Kontext. Wir können diesen Kontext verwenden, um alle globalen Moduldefinitionen zu bestimmen. Geteilte Abhängigkeiten können durch Vorabladen der Plugin-Skripte und Vergleichen der Abhängigkeiten mit den globalen Abhängigkeiten bestimmt werden. Gemeinsam genutzte Module können in der Sandbox Kontext injiziert werden:

function injectDependency(dependencyName, contextName) { 
    var ctx = getContext(contextName); 
    var dependencyInstance = require(dependencyName); 

    ctx.defQueue.push([ dependencyName, [], function() { return dependencyInstance; }]); 
} 

function getContext(contextName) { 
    return requirejs.s.contexts[contextName]; 
} 

In diesem Snippet nennen wir benötigen in einem nicht-Asynchron-Weg, um die globale Instanz des Moduls zu erhalten. Das Modul wird in die Sandbox eingefügt, indem es in die Definitionswarteschlange gedrückt wird.

Eine Implementierung dieser Lösung des Plugin Loader kann von https://github.com/igsp/requireplug heruntergeladen werden.

Ich stellte eine detailliertere Beschreibung der Mechanik dieser Lösung auf meinem Blog: https://intergalacticspacepocket.wordpress.com/2014/08/07/nesting-requirejs-contexts-with-shared-dependencies/

Verwandte Themen