Чому Magento 2 використовує RequireJS `map` замість` path '


17

У реалізації Magento 2 RequireJS багато основних модулів використовують конфігурацію, подібну до цієї

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 використовує його як заміну для майна RequireJSpaths . тобто здається, що Мадженто міг би досягти того ж, з наступним

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.