Por que o Magento 2 usa RequireJS `map` em vez de` path`

17

Na implementação RequireJS do Magento 2, muitos módulos principais usam uma configuração semelhante a esta

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

No RequireJS, a mapdiretiva de configuração permite que os desenvolvedores digam ao RequireJS

Quando você carrega o módulo X e ele usa o módulo Y, substitua o módulo Y pelo módulo Z - mas apenas para o módulo X

Ou, no código

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

O maprecurso basicamente permite que você troque as definições dos módulos via configuração - no Magento, é um recurso de reescrita de módulo para javascript.

O que não está claro para mim, porém, é o uso pesado de Magento *como a chave para a mappropriedade.

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

O *basicamente diz * faça esse mapeamento para todos os módulos, e seu caso de uso pretendido é fornecer um aliasing de módulo básico que pode ser alterado para módulos mais específicos.

No entanto, o Magento parece usá-lo como um substituto da pathspropriedade do RequireJS . ou seja, parece que o Magento poderia ter conseguido a mesma coisa com os seguintes

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

e, em seguida, faz seletivamente o mapeamento específico quando necessário.

Alguém sabe por que o Magento escolheu map:*como método de alias de caminho? ie - é meu entendimento da diferença entre mape pathincompleto - ou é uma daquelas coisas "Seis de uma, meia dúzia das outras". Ou existe algum comportamento adicional que o Magento obtém ao fazê-lo dessa maneira.

Não pedindo para resolver um problema específico, pedindo para esclarecer quaisquer mal-entendidos da implementação do RequireJS e Magento antes de começar a escrever bastante sobre isso :)

Alan Storm
fonte

Respostas:

22

Depois de pesquisar isso um pouco mais, encontrei uma grande diferença entre mape path. Não tenho certeza se a equipe principal do Magento faz uso deliberado disso, mas, de acordo com essa resposta do Stack Overflow, quando você define uma mapconfiguração, na verdade você está definindo um prefixo para mapeamentos. isto é, não apenas isso

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

verifique se o carregamento do editTriggermódulo realmente carrega o mage/edit-triggermódulo, mas também isso editTrigger/foocarregaria o mage/edit-trigger/foomódulo.

A pathsdiretiva não é um mapeamento de prefixo. É um mapeamento individual simples.

Alan Storm
fonte
1
Além disso, se eu me lembrar corretamente, path: {foo: 'bar'}impedirá você de exigir barexplicitamente e permitirá apenas acessá-lo por fooapelido.
precisa saber é