Les systèmes d'objets basés sur RequireJS de Magento 2 contiennent une fonctionnalité appelée "mixins". Un mixage Magento 2 n'est pas ce qu'un ingénieur logiciel devrait normalement considérer comme un mixage / trait . Au lieu de cela, un mix Magento 2 vous permet de modifier l'objet / la valeur retournée par un module RequireJS avant que cet objet / la valeur ne soit utilisé par le programme principal. Vous configurez un mixage Magento 2 comme ceci (via un fichier 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
}
}
}
};
Ensuite, vous devez avoir hook.js
(ou le module RequireJS que vous avez configuré),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
retourner une fonction. Magento appellera cette fonction en passant une référence au "module" que vous souhaitez modifier. Dans notre exemple, ce sera l'objet renvoyé par le module RequireJS Magento_Checkout/js/view/form/element/email
. Il peut également s'agir d'une fonction, voire d'une valeur de mise à l'échelle (selon ce que le module RequireJS renvoie).
Ce système semble être appelé mixins
car il vous permet de créer un comportement de type mixin si l'objet renvoyé par le module RequireJS d'origine prend en charge la extend
méthode.
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Cependant, le système lui-même n'est qu'un moyen de se connecter à la création d'objets de module.
Préambule terminé - quelqu'un sait-il comment Magento a mis en œuvre cette fonctionnalité? Le site Web de RequireJS ne semble pas mentionner les mixins (bien que Google pense que vous voudrez peut-être la page du plugin de RequireJS ).
En dehors des requirejs-config.js
fichiers, le noyau javascript de Magento 2 ne mentionne que mixins
trois fichiers
$ 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);
Le mixins.js
fichier semble être un plugin RequireJS (basé sur les !...
mentions dans les commentaires - est-ce vrai?) Mais il n'est pas clair à 100% quand main.js
ou scripts.js
sont invoqués par Magento, ou comment la mixins
configuration personnalisée le fait à partir requirejs-config.js
du système d'écoute / crochet décrit ci-dessus.
Quelqu'un a-t-il une explication sur la façon dont ce système a été / est mis en œuvre / architecturé, en vue de pouvoir déboguer pourquoi un "mixin" peut ou non être appliqué?
mixins
configurationx-magento-init
et lesdata-mage-init
configurations? c'est-à-dire - dans l'exemple ci-dessus,path/to/configuration-modifier
retournerait également un rappel qui pourrait modifier les données de configuration? Ou autre chose?Pour compléter la réponse de Denis Rul .
Donc, si vous regardez une page Magento, voici les trois
<script/>
balises qui chargent Magento.Il s'agit de RequireJS lui-même (
require.js
), dumixins.js
plug - in et de la configuration fusionnée de RequireJS (requirejs-config.js
).Le
mixins.js
fichier définit un plugin RequireJS. Ce plugin est responsable du chargement et de l'appel des modules RequireJS qui écoutent les instanciations des autres modules RequireJS.Ce plugin contient également un programme requirejs après avoir défini le plugin mixin.
Ce second programme se charge juste défini
mixins
plug - in comme une dépendance, puis redéfinit les mondiauxrequire
,define
et lesrequirejs
fonctions. Cette redéfinition est ce qui permet au système "pas vraiment un mixage" de s'accrocher à l'instanciation initiale du module RequireJS avant de renvoyer les choses aux fonctions régulières.la source