Pourquoi Magento 2 utilise-t-il RequireJS `map` au lieu de` path`

17

Dans l'implémentation RequireJS de Magento 2, de nombreux modules de base utilisent une configuration similaire à celle-ci

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

Dans RequireJS, la mapdirective de configuration permet aux développeurs de dire à RequireJS

Lorsque vous chargez le module X et qu'il utilise le module Y, remplacez le module Y par le module Z - mais uniquement pour le module X

Ou, en code

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

La mapfonctionnalité vous permet essentiellement d'échanger les définitions de module via la configuration - dans Magento, c'est une fonctionnalité de réécriture de module pour javascript.

Ce qui n'est pas clair pour moi, c'est l'utilisation intensive par Magento de *la clé de la mappropriété.

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

Le *principe dit * faire ce mappage pour tous les modules, et son cas d'utilisation prévu est de fournir un alias de module de base qui peut être modifié pour des modules plus spécifiques.

Cependant, Magento semble l'utiliser en remplacement de la pathspropriété de RequireJS . c'est-à-dire que Magento aurait pu réaliser la même chose avec ce qui suit

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

puis effectue sélectivement un mappage spécifique en cas de besoin.

Est-ce que quelqu'un sait pourquoi Magento a choisi map:*comme méthode d'alias de chemin? c'est-à-dire - est-ce que je comprends la différence entre mapet pathincomplète - ou est-ce une de ces choses «Six d'un, une demi-douzaine d'autres». Ou existe-t-il un comportement supplémentaire que Magento obtient en procédant de cette façon?

Ne pas demander de résoudre un problème spécifique, demander de clarifier tout malentendu concernant l'implémentation de RequireJS et de Magento avant de commencer à écrire à ce sujet :)

Alan Storm
la source

Réponses:

23

Après des recherches un peu plus approfondies, j'ai trouvé une différence majeure entre mapet path. Je ne sais pas si l'équipe principale de Magento en fait un usage délibéré, mais d'après cette réponse Stack Overflow lorsque vous définissez une mapconfiguration, vous définissez en fait un préfixe pour les mappages. c'est-à-dire non seulement

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

s'assurer que le chargement du editTriggermodule charge réellement le mage/edit-triggermodule, mais cela editTrigger/foochargerait également le mage/edit-trigger/foomodule.

La pathsdirective n'est pas un mappage de préfixe. Il s'agit d'un simple mappage un à un.

Alan Storm
la source
1
De plus, si je me souviens bien, path: {foo: 'bar'}cela vous empêchera d'exiger barexplicitement et ne permettra d'y accéder que par fooalias.
mms27