Ti stai chiedendo come
Module_Name/js/path/to/module
diventa
//magento.example.com/static/frontend/Package/Theme/locale/Module_Name/js/path/to/module.js
Prima di tutto, è importante capire che questo è del tutto necessario JS, non qualsiasi salsa speciale Magento (anche se ce n'è un po 'altrove). Per la maggior parte, il front-end utilizza solo il normale comportamento di RequireJS. La magia è di solito nel modo in cui si genera pub/static
, vale a dire in che modo view/area/web/js/path/to/module.js
è collegata a symlink pub/static/area/Package/theme/Module_Name/js/path/to/module.js
. Questo è gestito dal processo di compilazione delle risorse statiche di Magento, e non ci vado qui.
requirejs-config.js
Introduciamo un nuovo file, che si parla: requirejs-config.js
. Questa è una salsa speciale di Magento 2, ma probabilmente non tanto quanto potresti pensare.
Questo file può essere qualsiasi JavaScript, ma dovrebbe almeno dichiarare una variabile (globale) chiamata config
. L'oggetto associato config
viene passato direttamente a requestJS per configurarlo.
Il modo in cui funziona Magento trova tutto requirejs-config.js
in un progetto. Questi possono trovarsi in un modulo, sotto view/area
o in un tema, nella sua directory principale e nella sostituzione del modulo di un tema, ad es Magento_Catalog/requirejs-config.js
. Si noti che ciò non include alcun figlio di una web
directory. Questo file, in generale, dovrebbe essere un fratello o una sorella web
.
Una volta globbed, ogni file viene decorato in una chiusura (quindi la nostra variabile globale in realtà non lo è) e una linea alla fine della chiusura passa la config
variabile require
all'oggetto. Questo può essere visto:
Questo è 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 arriva al front-end, sarà simile a questo:
(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);
})();
Questa decorazione è visibile in Magento\Framework\RequireJs\Config
.
Ognuno di questi file decorati viene concatenato e scaricato static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js
. Questa posizione è concordata in anticipo, in modo che l'HTML carichi questo script man mano che richiedeJS:
<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 come configurare RequireJS al di fuori dell'ambito di questa risposta, ma hanno abbastanza buona documentazione su questo . Ci sono due cose importanti da notare, però:
- Le chiamate successive a
require.config
sovrappongono gli oggetti uno sopra l'altro, quindi vince l'ultima scrittura. Non sostituiscono, il che è cruciale.
- C'è una configurazione nella parte superiore di questa configurazione che imposta baseUrl. Questo non è in a
requirejs-config.js
. Questo viene inserito in fase di compilazione da Magento\Framework\RequireJs\Config
.
Dimenticando per un momento come Magento risolva quali moduli RequireJS devono essere caricati (una buona discussione per un'altra volta, forse; Come suggerimento, guarda dentro mage/apply/main.js
), supponiamo di avere il codice:
require(['modulename'], function () {});
nel vuoto da qualche parte. Come fa Magento a sapere cosa fare?
Bene, la prima cosa che richiederà a JS è cercare modulename
nella sua mappatura. Nel nostro caso, imparerà che dovrebbe trattare tutte le richieste modulename
come richieste Module_Name/js/path/to/module
. Lo fa solo una volta. I mapping non sono ricorsivi. Io ripeto. Se si dispone di un mapping da a
a b
, e da b
a a
, questo cambierà ogni richiesta e non causerà un ciclo infinito.
Dopo aver esaminato la mappatura brouhaha, RequireJS esamina ciò che ha. Se termina .js
e non sembra un collegamento assoluto o un URL, anteporrà la configurazione baseUrl
e caricherà quello script attraverso le sue normali procedure. Se non termina in .js
e non è un collegamento o URL assoluto, verrà aggiunto .js
alla fine, quindi anteporre la configurazione baseUrl
e caricare attraverso le sue normali procedure. Se requestJS ritiene che abbia un URL, prova solo a caricarlo.