I sistemi di oggetti basati su RequireJS di Magento 2 contengono una funzione chiamata "mixin". Un mixin Magento 2 non è ciò che un ingegnere del software normalmente considererebbe un mixin / tratto . Invece, un mixin Magento 2 consente di modificare l'oggetto / valore restituito da un modulo RequireJS prima che l'oggetto / valore venga utilizzato dal programma principale. Configura un mixin Magento 2 in questo modo (tramite un file requestjs-config.js)
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
}
}
}
};
Quindi, devi avere hook.js
(o qualsiasi modulo RequireJS che hai configurato),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
restituisce una funzione. Magento chiamerà questa funzione, passando un riferimento al "modulo" che si desidera modificare. Nel nostro esempio questo sarà l'oggetto restituito dal modulo RequireJSMagento_Checkout/js/view/form/element/email
. Potrebbe anche trattarsi di una funzione o persino di un valore dello scaler (a seconda di cosa restituisce il modulo RequireJS).
Questo sistema sembra essere chiamato mixins
perché consente di creare un comportamento simile al mixin se l'oggetto restituito dal modulo RequireJS originale supporta il extend
metodo.
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Tuttavia, il sistema stesso è solo un modo per agganciarsi alla creazione di oggetti del modulo.
Preambolo finito: qualcuno sa come Magento ha implementato questa funzionalità? Il sito web RequireJS non sembra menzionare i mixin (anche se Google pensa che potresti voler la pagina dei plugin di RequireJS ).
Al di fuori dei requirejs-config.js
file, il core javascript di Magento 2 menziona solo mixins
in tre file
$ 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);
Il mixins.js
file sembra essere un plug-in RequireJS (basato sulle !...
menzioni nei commenti - è giusto?) Ma non è chiaro al 100% quando main.js
o scripts.js
sono invocati da Magento o come la mixins
configurazione personalizzata lo fa entrare requirejs-config.js
nel sistema listener / hook descritto sopra.
Qualcuno ha una spiegazione di come questo sistema è stato / è implementato / architected, con un occhio verso la possibilità di eseguire il debug perché un "mixin" può o meno essere applicato?
mixins
configurazionex-magento-init
e ledata-mage-init
configurazioni? cioè - nell'esempio sopra riportato, verrebbepath/to/configuration-modifier
restituito anche un callback che potrebbe modificare i dati di configurazione? O qualcos'altro?