Os sistemas de objetos baseados no RequireJS do Magento 2 contêm um recurso chamado "mixins". Um mixin Magento 2 não é o que um engenheiro de software normalmente pensaria como um mixin / característica . Em vez disso, um mixin do Magento 2 permite modificar o objeto / valor retornado por um módulo RequireJS antes que esse objeto / valor seja usado pelo programa principal. Você configura um mixin Magento 2 como este (através de um arquivo 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
}
}
}
};
Então, você precisa ter hook.js
(ou qualquer módulo RequireJS que você configurou),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
retornar uma função. O Magento chamará essa função, passando uma referência ao "módulo" que você deseja modificar. No nosso exemplo, este será o objeto retornado pelo módulo RequireJS Magento_Checkout/js/view/form/element/email
. Isso também pode ser uma função ou mesmo um valor de escalonador (dependendo do que o módulo RequireJS retornar).
Esse sistema parece ser chamado mixins
porque permite criar um comportamento semelhante ao mixin se o objeto retornado pelo módulo RequireJS original suportar o 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);
};
});
No entanto, o próprio sistema é apenas uma maneira de se conectar à criação de objetos do módulo.
Preâmbulo terminado - alguém sabe como o Magento implementou essa funcionalidade? O site RequireJS parece não mencionar mixins (embora o Google pense que você pode querer a página de plug-in do RequireJS ).
Fora dos requirejs-config.js
arquivos, o javascript principal do Magento 2 menciona apenas mixins
em três arquivos
$ 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);
O mixins.js
arquivo parece ser um plug-in RequireJS (com base nas !...
menções nos comentários - isso está certo?), Mas não está 100% claro quando main.js
ou scripts.js
é invocado pelo Magento, ou como a mixins
configuração personalizada faz parte do requirejs-config.js
sistema listener / hook descrito acima.
Alguém tem uma explicação de como esse sistema foi / é implementado / arquitetado, com o objetivo de ser capaz de depurar por que um "mixin" pode ou não ser aplicado?
mixins
configuração fazx-magento-init
e asdata-mage-init
configurações? ie - no exemplo acima, vocêpath/to/configuration-modifier
também retornaria um retorno de chamada que poderia modificar os dados de configuração? Ou outra coisa?Para completar a resposta de Denis Rul .
Então, se você olhar uma página do Magento, aqui estão as três
<script/>
tags que carregam o Magento.Este é o próprio RequireJS (
require.js
), omixins.js
plug - in e a configuração RequireJS mesclada (requirejs-config.js
).O
mixins.js
arquivo define um plug-in RequireJS. Esse plug-in é responsável por carregar e chamar os módulos RequireJS que atendem à instanciação de outros módulos RequireJS.Este plugin também contém um programa requirejs depois de definir o plugin mixin.
Este segundo programa carrega o justo definido
mixins
plugin como uma dependência e, em seguida, redefine os globaisrequire
,define
erequirejs
funções. Essa redefinição é o que permite que o sistema "não seja realmente um mixin" se ligue à instanciação inicial do módulo RequireJS antes de repassar as coisas para as funções regulares.fonte