Los sistemas de objetos basados en RequireJS de Magento 2 contienen una característica llamada "mixins". Un Magento 2 mixin no es lo que un ingeniero de software normalmente consideraría como un mixin / rasgo . En cambio, un mixin de Magento 2 le permite modificar el objeto / valor devuelto por un módulo RequireJS antes de que el programa principal use ese objeto / valor. Configura un Magento 2 mixin como este (a través de un archivo requirejs-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
}
}
}
};
Luego, debe tener hook.js(o cualquier módulo RequireJS que haya configurado),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
devolver una función Magento llamará a esta función, pasando una referencia al "módulo" que desea modificar. En nuestro ejemplo, este será el objeto devuelto por el módulo RequireJS Magento_Checkout/js/view/form/element/email. Esto también puede ser una función, o incluso un valor de escala (dependiendo de lo que devuelva el módulo RequireJS).
Parece que se llama a este sistema mixinsporque le permite crear un comportamiento similar a la mezcla si el objeto devuelto por el módulo RequireJS original admite el extendmétodo.
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Sin embargo, el sistema en sí mismo es solo una forma de conectarse a la creación de objetos de módulo.
Preámbulo terminado: ¿alguien sabe cómo Magento ha implementado esta funcionalidad? El sitio web RequireJS no parece mencionar mixins (aunque Google cree que puede querer la página de complementos de RequireJS ).
Fuera de los requirejs-config.jsarchivos, el núcleo de JavaScript de Magento 2 solo menciona mixinstres archivos
$ 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);
El mixins.jsarchivo parece ser un RequireJS plugins (basado en el !...menciones en los comentarios -? Es este derecho), pero no es 100% claro cuando main.jso scripts.jsse invocan por Magento, o cómo la costumbre mixinsde configuración hace que sea desde requirejs-config.jsdentro del sistema oyente / gancho descrito arriba.
¿Alguien tiene una explicación de cómo este sistema fue / es implementado / diseñado, con miras a poder depurar por qué un "mixin" puede o no ser aplicado?

mixinsconfiguraciónx-magento-inity lasdata-mage-initconfiguraciones? es decir, en su ejemplo anterior, ¿path/to/configuration-modifiertambién devolvería una devolución de llamada que podría modificar los datos de configuración? ¿O algo mas?Para completar la respuesta de Denis Rul .
Entonces, si mira una página de Magento, aquí están las tres
<script/>etiquetas que cargan Magento.Este es RequireJS en sí (
require.js), elmixins.jscomplemento y la configuración de RequireJS combinada (requirejs-config.js).El
mixins.jsarchivo define un complemento RequireJS. Este complemento es responsable de cargar y llamar a los módulos RequireJS que escuchan la instanciación de otros módulos RequireJS.Este complemento también contiene un programa requirejs después de definir el complemento mixin.
Este segundo programa se carga la acaban de definir
mixinsplug-in como una dependencia, y luego redefine los mundialesrequire,defineyrequirejsfunciones. Esta redefinición es lo que permite que el sistema "no sea realmente un mixin" se enganche en la instanciación inicial del módulo RequireJS antes de devolver las cosas a las funciones normales.fuente