Warum verwendet Magento 2 RequireJS `map` anstelle von` path`?

17

In der RequireJS-Implementierung von Magento 2 verwenden viele Kernmodule eine solche Konfiguration

map: {
    '*': {
        editTrigger:   'mage/edit-trigger',
        addClass:      'Magento_Translation/add-class'
    }
}

In RequireJS mapkönnen Entwickler anhand der Konfigurationsanweisung festlegen, dass RequireJS verwendet werden soll

Wenn Sie Modul X laden und es Modul Y verwendet, ersetzen Sie Modul Y durch Modul Z - jedoch nur für Modul X

Oder im Code

map: {
    'modulex':{
        'moduley':'modulez'
    }
}

Mit dieser mapFunktion können Sie Moduldefinitionen über die Konfiguration austauschen. In Magento ist dies eine Funktion zum Umschreiben von Modulen für Javascript.

Was mir jedoch nicht klar ist, ist Magentos häufiger Gebrauch des *als Schlüssel für die mapImmobilie.

map: {
    '*': {
        editTrigger:   'mage/edit-trigger',
        addClass:      'Magento_Translation/add-class'
    }
}

Das *sagt im Grunde * tun , um diese Zuordnung für alle Module und der bestimmungsgemäßen Gebrauch Fall ist , bietet ein Basismodul Aliasing , das für spezifischere Module verändert werden kann.

Magento scheint es jedoch als Ersatz für das pathsEigentum von RequireJS zu verwenden . Das heißt, es scheint, dass Magento das Gleiche mit Folgendem hätte erreichen können

paths: {
    'editTrigger': 'mage/edit-trigger',
    'addClass':    'Magento_Translation/add-class',
}

und führt dann bei Bedarf selektiv eine spezifische Zuordnung durch.

Weiß jemand, warum Magento map:*als Methode für das Pfad-Aliasing gewählt hat? dh - ist mein Verständnis des Unterschieds zwischen mapund pathunvollständig - oder ist dies eines dieser "Sechs von einem, einem halben Dutzend der anderen" Dinge. Oder gibt es ein zusätzliches Verhalten, das Magento auf diese Weise erhält?

Nicht darum bitten, ein bestimmtes Problem zu lösen, Missverständnisse über RequireJS und Magentos Implementierung zu klären, bevor ich anfange, ausführlich darüber zu schreiben :)

Alan Storm
quelle

Antworten:

22

Nachdem ich dies etwas genauer untersucht habe, habe ich einen großen Unterschied zwischen mapund festgestellt path. Ich bin mir nicht sicher, ob das Magento-Kernteam dies absichtlich nutzt, aber anhand dieser Stapelüberlauf-Antwort definieren Sie beim Definieren einer mapKonfiguration tatsächlich ein Präfix für Zuordnungen. dh nicht nur das wird

map: {
    '*': {
        editTrigger:   'mage/edit-trigger',
    }
}

Stellen Sie sicher, dass das Laden des editTriggerModuls tatsächlich das Modul lädt mage/edit-trigger, aber auch, dass editTrigger/foodas mage/edit-trigger/fooModul geladen würde .

Die pathsDirektive ist keine Präfixzuordnung. Es ist eine einfache Eins-zu-Eins-Zuordnung.

Alan Storm
quelle
1
Auch, wenn ich mich richtig erinnere, path: {foo: 'bar'}blockiert es Sie barexplizit und erlaubt nur den Zugriff per fooAlias.
mms27