Dlaczego Magento 2 używa RequireJS `map` zamiast` path`

17

W implementacji RequireJS Magento 2 wiele podstawowych modułów używa konfiguracji podobnej do tej

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

W RequireJS mapdyrektywa w sprawie konfiguracji pozwala programistom powiedzieć RequireJS

Gdy ładujesz moduł X i używa on modułu Y, zamień moduł Y na moduł Z - ale tylko w przypadku modułu X

Lub w kodzie

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

Ta mapfunkcja zasadniczo umożliwia wymianę definicji modułów poprzez konfigurację - w Magento speak jest to funkcja przepisywania modułów dla javascript.

Nie jest dla mnie jasne, czy Magento często używa *klucza jako klucza do mapnieruchomości.

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

*Zasadzie mówi * zrobić mapowanie dla wszystkich modułów, a jego stosowanie jest przeznaczony sprawa jest dostarczenie aliasing moduł podstawowy , który można zmienić na bardziej konkretnych modułów.

Wydaje się jednak, że Magento używa go jako zamiennika właściwości RequireJSpaths . tzn. wydaje się, że Magento mógł osiągnąć to samo, co następuje

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

a następnie selektywnie wykonuje określone mapowanie w razie potrzeby.

Czy ktoś wie, dlaczego Magento wybrał map:*metodę aliasingu ścieżek? tzn. - czy rozumiem różnicę między niepełną mapa pathniepełną - czy też jest to jedna z tych „Sześć z jednego, pół tuzina innych” rzeczy. Czy może jest jakieś dodatkowe zachowanie Magento, robiąc to w ten sposób.

Nie pytam o rozwiązanie konkretnego problemu, pytam o wyjaśnienie wszelkich nieporozumień dotyczących implementacji RequireJS i Magento, zanim zacznę pisać o tym intensywnie :)

Alan Storm
źródło

Odpowiedzi:

23

Po dokładniejszych badaniach odkryłem jedną zasadniczą różnicę między mapi path. Nie jestem pewien, czy główny zespół Magento celowo z tego korzysta, ale zgodnie z odpowiedzią dotyczącą Przepełnienia stosu podczas definiowania mapkonfiguracji faktycznie definiujesz prefiks mapowań. tj. nie tylko to

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

zapewnienia załadowaniu editTriggermoduł rzeczywiście ładuje mage/edit-triggermoduł, ale również , że editTrigger/foobyłoby załadować mage/edit-trigger/foomoduł.

pathsDyrektywa nie jest odwzorowaniem prefiks. To proste mapowanie jeden na jeden.

Alan Storm
źródło
1
Ponadto, jeśli dobrze pamiętam, path: {foo: 'bar'}zablokuję cię od barjawnego wymagania i pozwoli ci na dostęp tylko przez fooalias.
mms27