Você está se perguntando como
Module_Name/js/path/to/module
torna-se
//magento.example.com/static/frontend/Package/Theme/locale/Module_Name/js/path/to/module.js
Antes de tudo, é importante entender que isso é totalmente necessário para o JS, não para qualquer molho especial do Magento (embora exista um pouco disso em outro lugar). Na maioria das vezes, o front-end usa apenas o comportamento normal do RequireJS. A mágica geralmente está na forma como gera pub/static
, ou seja, como view/area/web/js/path/to/module.js
é simbolizado pub/static/area/Package/theme/Module_Name/js/path/to/module.js
. Isso é tratado pelo processo de compilação de ativos estáticos do Magento, e eu não vou entrar aqui.
requirejs-config.js
Vamos introduzir um novo arquivo, que você menciona: requirejs-config.js
. Este é um molho especial do Magento 2, mas provavelmente não tanto quanto você imagina.
Esse arquivo pode ser qualquer JavaScript, mas deve, no mínimo, declarar uma variável (global) chamada config
. O objeto vinculado a config
é passado diretamente para exigir que o JS o configure.
A maneira como isso funciona é que o Magento encontra tudo isso requirejs-config.js
em um projeto. Eles podem estar em um módulo, sob view/area
ou em um tema, em seu diretório raiz e na substituição do módulo de um tema, por exemplo Magento_Catalog/requirejs-config.js
. Observe que isso não inclui nenhum filho de um web
diretório. Esse arquivo, em geral, deve ser um irmão de um web
diretório.
Uma vez globbed, cada arquivo é decorado com um fechamento (portanto, nossa variável global não é) e uma linha no final do fechamento passa a config
variável para o require
objeto. Isso pode ser visto:
Isto é Magento_Checkout::view/frontend/requirejs-config.js
:
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
var config = {
map: {
'*': {
discountCode: 'Magento_Checkout/js/discount-codes',
shoppingCart: 'Magento_Checkout/js/shopping-cart',
regionUpdater: 'Magento_Checkout/js/region-updater',
opcOrderReview: 'Magento_Checkout/js/opc-order-review',
sidebar: 'Magento_Checkout/js/sidebar',
payment: 'Magento_Checkout/js/payment',
paymentAuthentication: 'Magento_Checkout/js/payment-authentication'
}
}
};
Quando chega ao front-end, fica assim:
(function() {
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
var config = {
map: {
'*': {
discountCode: 'Magento_Checkout/js/discount-codes',
shoppingCart: 'Magento_Checkout/js/shopping-cart',
regionUpdater: 'Magento_Checkout/js/region-updater',
opcOrderReview: 'Magento_Checkout/js/opc-order-review',
sidebar: 'Magento_Checkout/js/sidebar',
payment: 'Magento_Checkout/js/payment',
paymentAuthentication: 'Magento_Checkout/js/payment-authentication'
}
}
};
require.config(config);
})();
Esta decoração pode ser vista em Magento\Framework\RequireJs\Config
.
Cada um desses arquivos decorados é concatenado e despejado static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js
. Esse local é acordado com antecedência, para que o HTML carregue esse script à medida que o requireJS:
<script type="text/javascript" src="https://magento.example.com/static/area/Package/theme/locale/requirejs/require.js"></script>
<script type="text/javascript" src="https://magento.example.com/static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js"></script>
Considero como configurar o RequireJS fora do escopo para esta resposta, mas eles têm uma documentação bastante boa sobre isso . Há duas coisas importantes a serem observadas:
- Chamadas sucessivas
require.config
colocarão objetos sobrepostos, para que a última gravação ganhe. Eles não substituem, o que é crucial.
- Há uma configuração na parte superior desta configuração que define baseUrl. Isto não está em um
requirejs-config.js
. Isso é inserido no momento da compilação por Magento\Framework\RequireJs\Config
.
Esquecendo por um momento como o Magento descobre quais módulos do RequireJS precisam ser carregados (uma boa discussão para outra hora, talvez; como sugestão, veja mage/apply/main.js
), vamos supor que temos o código:
require(['modulename'], function () {});
no vácuo em algum lugar. Como o Magento sabe o que fazer?
Bem, a primeira coisa que o requireJS fará é procurar modulename
em seu mapeamento. No nosso caso, ele aprenderá que deve tratar todos os pedidos modulename
como um pedido para Module_Name/js/path/to/module
. Só faz isso uma vez. Os mapeamentos não são recursivos. Eu repito. Se você tiver um mapeamento de a
para b
e de b
para a
, isso trocará cada solicitação e não causará um loop infinito.
Depois de analisarmos o mapeamento, o RequireJS analisa o que ele possui. Se ele terminar .js
e não parecer um link absoluto ou uma URL, ele acrescentará o baseUrl
script configurado e carregará esse script através de seus procedimentos normais. Se ele não terminar .js
e não for um link ou URL absoluto, será adicionado .js
ao final e, em seguida, anteceda a configuração baseUrl
e carregue seus procedimentos normais. Se o requireJS considerar que possui uma URL, apenas tentará carregá-la.