Почему Magento 2 использует RequireJS `map` вместо` path`

17

В реализации RequireJS в Magento 2 многие основные модули используют такую ​​конфигурацию

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

В RequireJS mapдиректива конфигурации позволяет разработчикам сообщать RequireJS

Когда вы загружаете модуль X, и он использует модуль Y, замените модуль Y на модуль Z - но только для модуля X

Или в коде

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

Эта mapфункция, в основном, позволяет вам менять определения модулей через конфигурацию - в языке Magento это функция перезаписи модулей для javascript.

Что мне не понятно, так это интенсивное использование Magento *ключа в качестве mapсвойства.

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

В *основном говорится * сделать это сопоставление для всех модулей, и его предполагаемый вариант использования заключается в предоставлении базового псевдонима модуля, который можно изменить для более конкретных модулей.

Тем не менее, Magento , как представляется , использовать его в качестве замены для RequireJS игровой pathsсобственности . то есть кажется, что Magento мог бы достичь того же с помощью следующего

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

и затем выборочно делает определенное отображение при необходимости.

Кто-нибудь знает, почему Magento выбрал в map:*качестве метода наложения пути? то есть - мое понимание разницы между mapи pathнеполным - или это одна из тех вещей «шесть из одной, полдюжины других». Или есть какое-то дополнительное поведение, которое получает Magento, делая это таким образом.

Не просить решить конкретную проблему, просить прояснить любые недоразумения в реализации RequireJS и Magento, прежде чем я начну об этом много писать :)

Алан Сторм
источник

Ответы:

23

Изучив это немного подробнее, я обнаружил одно существенное различие между mapи path. Я не уверен, что основная команда Magento использует это преднамеренно, но согласно этому ответу переполнения стека, когда вы определяете mapконфигурацию, вы фактически определяете префикс для отображений. т.е. не только это

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

обеспечить загружающий editTriggerмодуль фактически загружает mage/edit-triggerмодуль, но и , что editTrigger/fooбы загрузить mage/edit-trigger/fooмодуль.

pathsДиректива не является отображением префиксов. Это простое сопоставление один к одному.

Алан Сторм
источник
1
Также, если я правильно запомню, path: {foo: 'bar'}вы заблокируете запрос barявно и разрешите доступ к нему только по fooпсевдониму.
mms27