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 mixins
porque le permite crear un comportamiento similar a la mezcla si el objeto devuelto por el módulo RequireJS original admite el extend
mé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.js
archivos, el núcleo de JavaScript de Magento 2 solo menciona mixins
tres 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.js
archivo parece ser un RequireJS plugins (basado en el !...
menciones en los comentarios -? Es este derecho), pero no es 100% claro cuando main.js
o scripts.js
se invocan por Magento, o cómo la costumbre mixins
de configuración hace que sea desde requirejs-config.js
dentro 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?
mixins
configuraciónx-magento-init
y lasdata-mage-init
configuraciones? es decir, en su ejemplo anterior, ¿path/to/configuration-modifier
tambié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.js
complemento y la configuración de RequireJS combinada (requirejs-config.js
).El
mixins.js
archivo 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
mixins
plug-in como una dependencia, y luego redefine los mundialesrequire
,define
yrequirejs
funciones. 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