Die RequireJS-basierten Objektsysteme von Magento 2 enthalten eine Funktion namens "Mixins". Ein Magento 2-Mixin ist nicht das, was ein Software-Ingenieur normalerweise als Mixin / Merkmal betrachtet . Stattdessen können Sie mit einem Magento 2-Mixin das von einem RequireJS-Modul zurückgegebene Objekt / den Wert ändern, bevor dieses Objekt / dieser Wert vom Hauptprogramm verwendet wird. Sie konfigurieren ein Magento 2-Mixin wie folgt (über eine requirejs-config.js-Datei)
var config = {
'config':{
'mixins': {
//the module to modify
'Magento_Checkout/js/view/form/element/email': {
//your module that will do the modification
'Pulsestorm_RequireJsRewrite/hook':true
}
}
}
};
Dann müssen Sie hook.js
(oder was auch immer RequireJS-Modul, das Sie konfiguriert haben),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
Funktion zurückgeben. Magento ruft diese Funktion auf und übergibt einen Verweis auf das "Modul", das Sie ändern möchten. In unserem Beispiel ist dies das Objekt, das vom RequireJS-Modul zurückgegeben wird Magento_Checkout/js/view/form/element/email
. Dies kann auch eine Funktion oder sogar ein Skalierungswert sein (abhängig davon, was das RequireJS-Modul zurückgibt).
Dieses System scheint aufgerufen zu werden, mixins
weil Sie damit ein mixin-ähnliches Verhalten erstellen können, wenn das vom ursprünglichen RequireJS-Modul zurückgegebene Objekt die extend
Methode unterstützt .
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Das System selbst ist jedoch nur eine Möglichkeit, sich in die Erstellung von Modulobjekten einzuklinken.
Präambel fertig - weiß jemand, wie Magento diese Funktionalität implementiert hat? Die RequireJS Website scheint nicht Mixins zu erwähnen (obwohl Google denkt , dass Sie vielleicht RequireJS Plugin Seite wollen ).
Außerhalb von requirejs-config.js
Dateien erwähnt das Magento 2-Kern-Javascript nur mixins
drei Dateien
$ find vendor/magento/ -name '*.js' | xargs ack mixins
vendor/magento/magento2-base/lib/web/mage/apply/main.js
73: if (obj.mixins) {
74: require(obj.mixins, function () {
79: delete obj.mixins;
vendor/magento/magento2-base/lib/web/mage/apply/scripts.js
39: if (_.has(obj, 'mixins')) {
41: data[key].mixins = data[key].mixins || [];
42: data[key].mixins = data[key].mixins.concat(obj.mixins);
43: delete obj.mixins;
vendor/magento/magento2-base/lib/web/mage/requirejs/mixins.js
5:define('mixins', [
24: * Adds 'mixins!' prefix to the specified string.
30: return 'mixins!' + name;
76: * Iterativly calls mixins passing to them
80: * @param {...Function} mixins
84: var mixins = Array.prototype.slice.call(arguments, 1);
86: mixins.forEach(function (mixin) {
96: * Loads specified module along with its' mixins.
102: mixins = this.getMixins(path),
103: deps = [name].concat(mixins);
111: * Retrieves list of mixins associated with a specified module.
114: * @returns {Array} An array of paths to mixins.
118: mixins = config[path] || {};
120: return Object.keys(mixins).filter(function (mixin) {
121: return mixins[mixin] !== false;
126: * Checks if specified module has associated with it mixins.
137: * the 'mixins!' plugin prefix if it's necessary.
172: 'mixins'
173:], function (mixins) {
237: deps = mixins.processNames(deps, context);
252: queueItem[1] = mixins.processNames(lastDeps, context);
Die mixins.js
Datei erscheint ein RequireJS sein Plugin (basierend auf der !...
Erwähnungen in den Kommentaren - ist dies der richtige) , aber es ist nicht 100% klar , wann main.js
oder scripts.js
werden von Magento aufgerufen, oder wie die benutzerdefinierte mixins
Konfiguration macht es aus requirejs-config.js
in den Hörer / Hakensystem oben beschrieben.
Hat jemand eine Erklärung dafür, wie dieses System implementiert wurde / wird / wird, mit dem Ziel zu debuggen, warum ein "Mixin" angewendet werden kann oder nicht?
mixins
Konfiguration inx-magento-init
unddata-mage-init
Konfigurationen? dh - in obigem Beispiel würdepath/to/configuration-modifier
auch ein Rückruf zurückgegeben, der die Konfigurationsdaten ändern könnte? Oder etwas anderes?Um die Antwort von Denis Rul abzurunden .
Wenn Sie sich also eine Magento-Seite ansehen, finden Sie hier die drei
<script/>
Tags, mit denen Magento geladen wird.Dies ist RequireJS selbst (
require.js
), dasmixins.js
Plugin und die zusammengeführte RequireJS-Konfiguration (requirejs-config.js
).Die
mixins.js
Datei definiert ein RequireJS-Plugin. Dieses Plugin ist für das Laden und Aufrufen der RequireJS-Module verantwortlich, die auf die Instantiierung anderer RequireJS-Module warten.Dieses Plugin auch enthält ein requirejs Programm , nachdem es das mixin Plugin definiert.
Dieses zweite Programm lädt die gerade definiert
mixins
als Abhängigkeit Plugin, und dann neu definiert die globalenrequire
,define
undrequirejs
Funktionen. Diese Neudefinition ermöglicht es dem "nicht wirklich mischbaren" System, sich in die anfängliche Instanziierung des RequireJS-Moduls einzuklinken, bevor die Dinge an die regulären Funktionen zurückgegeben werden.quelle