¿Por qué Magento 2 utiliza RequireJS `map` en lugar de` path`

17

En la implementación RequireJS de Magento 2, muchos módulos principales usan una configuración similar a esta

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

En RequireJS, la mapdirectiva de configuración permite a los desarrolladores decirle a RequireJS

Cuando cargue el módulo X y use el módulo Y, reemplace el módulo Y con el módulo Z, pero solo para el Módulo X

O, en código

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

La mapcaracterística básicamente le permite intercambiar definiciones de módulos a través de la configuración: en Magento speak, es una función de reescritura de módulos para javascript.

Sin embargo, lo que no está claro para mí es el uso intensivo de Magento *como la clave de la mappropiedad.

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

El *dice básicamente * hacer esta asignación para todos los módulos, y su caso es el uso previsto es proporcionar un alias de módulo base que puede ser cambiado para más módulos específicos.

Sin embargo, Magento parece usarlo como un reemplazo para la pathspropiedad de RequireJS . es decir, parece que Magento podría haber logrado lo mismo con lo siguiente

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

y luego realiza un mapeo selectivo cuando sea necesario.

¿Alguien sabe por qué Magento eligió map:*como método de alias de ruta? es decir, - es mi comprensión de la diferencia entre mape pathincompleta - o se trata de uno de los "Seis de uno, media docena de las otras cosas". ¿O hay algún comportamiento adicional que Magento obtiene al hacerlo de esta manera?

No pedir resolver un problema específico, pedir aclarar cualquier malentendido sobre la implementación de RequireJS y Magento antes de comenzar a escribir mucho sobre él :)

Alan Storm
fuente

Respuestas:

22

Después de investigar esto un poco más, he encontrado una gran diferencia entre mapy path. No estoy seguro de si el equipo central de Magento hace un uso deliberado de esto, pero según esta respuesta de Stack Overflow cuando define una mapconfiguración, en realidad está definiendo un prefijo para las asignaciones. es decir, no solo esto

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

asegúrese de que la carga del editTriggermódulo realmente cargue el mage/edit-triggermódulo, pero también eso editTrigger/foocargaría el mage/edit-trigger/foomódulo.

La pathsdirectiva no es un mapeo de prefijos. Es un simple mapeo uno a uno.

Alan Storm
fuente
1
Además, si recuerdo correctamente, path: {foo: 'bar'}bloqueará su solicitud barexplícitamente y solo permitirá acceder a él por fooalias.
mms27