2013-02-15 4 views
6

Zacząłem używać kontekstów requirejs jako sposobu na partycjonowanie dużej aplikacji na pojedynczą stronę, która składa się z pojedynczych autonomicznych SPA, które mają swój własny zestaw zależności.Praktyka do obsługi typowych zależności między wieloma kontekstami wymagającymi?

James Burke opisuje problem, który mam teraz napotykają w tym komentarzu github o wielu kontekstach i wspólnych zależności nie są udostępniane, https://github.com/aurajs/aura/pull/170#issuecomment-10973485

Jak mogę dzielić wspólne zależności pomiędzy różnymi requirejs kontekstach, nie powodując zduplikowane żądania dla tego samego pliku?

+0

Mam ten sam problem ... Jakbym go rozwiązać poprzez wstrzyknięcie odniesień do wspólnych modułów kiedy zainicjować każdą aplikację, ale byłoby świetnie, gdybyśmy mogli uzyskać dostęp do innych kontekstów z innego kontekstu – chchrist

+1

problem można rozwiązać, pisząc wtyczkę require.js, aby zarządzać kontekstami, wtyczka może określić, czy zależność może zostać wyciągnięta z globalnego kontekstu, aby uniknąć wielu wnioski o tę samą zależność. Na to nie ma odpowiedzi, ponieważ nie ma otwartych rozwiązań. Zobacz http://requirejs.org/docs/plugins.html –

+1

Użyj przeglądania: https://github.com/substack/node-browserify/ – avetisk

Odpowiedz

1

Napotkałem ten sam problem, co opisany. Napisałem wtyczkę, która zajmuje się dzieleniem wspólnych zależności między zagnieżdżonymi kontekstami.

Requirejs ma mapę, która zawiera wszystkie konteksty i to określono zależności:

requirejs.s.contexts

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

Kontekst _ jest główny kontekst. Możemy wykorzystać ten kontekst do określenia wszystkich globalnych definicji modułów. Współdzielone zależności można określić wstępnie wczytując skrypty wtyczek i porównując zależności z globalnymi zależnościami. Udostępnione moduły mogą być wstrzykiwane w kontekście piaskownicy:

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]; 
} 

W tym fragmencie nazywamy wymagają w sposób asynchroniczny bez uzyskania globalnego instancji modułu. Moduł jest wstrzykiwany w piaskownicy poprzez naciśnięcie go w kolejce definicji.

Implementację tego rozwiązania programu ładującego wtyczki można pobrać z https://github.com/igsp/requireplug.

Zamieściłem bardziej szczegółowy opis mechaniki tego rozwiązania na moim blogu: https://intergalacticspacepocket.wordpress.com/2014/08/07/nesting-requirejs-contexts-with-shared-dependencies/

Powiązane problemy