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?