Sie fragen sich, wie
Module_Name/js/path/to/module
wird
//magento.example.com/static/frontend/Package/Theme/locale/Module_Name/js/path/to/module.js
Zuallererst ist es wichtig zu verstehen, dass dies ausschließlich JS erfordert, keine Magento-Spezialsauce (obwohl es einige davon anderswo gibt). Zum größten Teil verwendet das Front-End nur das normale Verhalten von RequireJS. Die Magie liegt normalerweise darin, wie sie erzeugt wird pub/static
, nämlich wie sie miteinander verbunden view/area/web/js/path/to/module.js
ist pub/static/area/Package/theme/Module_Name/js/path/to/module.js
. Dies wird durch den statischen Asset-Kompilierungsprozess von Magento erledigt, und ich werde hier nicht darauf eingehen.
requirejs-config.js
Lassen Sie uns eine neue Datei vorstellen, die Sie erwähnen : requirejs-config.js
. Dies ist eine Magento 2-Spezialsauce, aber wahrscheinlich nicht so viel, wie Sie vielleicht denken.
Diese Datei kann ein beliebiges JavaScript sein, sollte jedoch mindestens eine (globale) Variable mit dem Namen deklarieren config
. Das an gebundene Objekt config
wird direkt an requireJS übergeben, um es zu konfigurieren.
So funktioniert das: Magento findet alles requirejs-config.js
in einem Projekt. Diese können sich in einem Modul unter view/area
oder in einem Thema in seinem Stammverzeichnis und in der Modulüberschreibung eines Themas befinden, z Magento_Catalog/requirejs-config.js
. Beachten Sie, dass dies kein untergeordnetes Element eines web
Verzeichnisses enthält. Diese Datei sollte im Allgemeinen ein Geschwister eines web
Verzeichnisses sein.
Nach dem Globbed wird jede Datei in einem Abschluss dekoriert (unsere globale Variable also nicht), und eine Zeile am Ende des Abschlusses übergibt die config
Variable an das require
Objekt. Das kann man sehen:
Dies ist 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'
}
}
};
Wenn es zum Frontend kommt, sieht es so aus:
(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);
})();
Diese Dekoration ist in zu sehen Magento\Framework\RequireJs\Config
.
Jede dieser dekorierten Dateien wird verkettet und abgelegt static/_requirejs/area/Package/theme/locale/secure/requirejs-config.js
. Dieser Speicherort wird im Voraus vereinbart, sodass der HTML-Code dieses Skript beim Laden vonJS lädt:
<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>
Ich überlege, wie RequireJS für diese Antwort außerhalb des Gültigkeitsbereichs konfiguriert werden kann, aber sie haben eine ziemlich gute Dokumentation dazu . Es gibt jedoch zwei wichtige Dinge zu beachten:
- Durch aufeinanderfolgende Aufrufe
require.config
werden Objekte übereinander gelegt, sodass der letzte Schreibvorgang gewinnt. Sie ersetzen nicht, was entscheidend ist.
- Oben in dieser Konfiguration befindet sich eine Konfiguration, mit der baseUrl festgelegt wird. Dies ist nicht in einem
requirejs-config.js
. Dies wird zur Kompilierungszeit von eingefügt Magento\Framework\RequireJs\Config
.
Vergessen mage/apply/main.js
wir für einen Moment, wie Magento herausfindet, welche RequireJS-Module geladen werden müssen (vielleicht eine gute Diskussion für ein anderes Mal; als Hinweis, schauen Sie rein), nehmen wir an, wir haben den Code:
require(['modulename'], function () {});
irgendwo im luftleeren Raum. Woher weiß Magento, was zu tun ist?
Nun, das erste, was erfordert, dass JS modulename
in seiner Zuordnung nachschlägt . In unserem Fall wird es lernen, dass es alle Anfragen modulename
als eine Anfrage an behandeln sollte Module_Name/js/path/to/module
. Das macht es nur einmal. Zuordnungen sind nicht rekursiv. Ich wiederhole. Wenn Sie eine Zuordnung von a
nach b
und von b
nach haben a
, tauscht dies jede Anforderung aus und verursacht keine Endlosschleife.
Sobald wir das Mapping brouhaha durchlaufen haben, schaut RequireJS, was es hat. Wenn es endet .js
und nicht wie ein absoluter Link oder eine URL aussieht, wird das konfigurierte baseUrl
Skript vorangestellt und das Skript gemäß den normalen Verfahren geladen. Wenn es nicht endet .js
und kein absoluter Link oder keine absolute URL ist, wird .js
es am Ende hinzugefügt , dann wird das Konfigurierte vorangestellt baseUrl
und durch seine normalen Verfahren geladen. Wenn requireJS davon ausgeht, dass es eine URL hat, versucht es nur, diese zu laden.