Systemy obiektowe oparte na RequireJS w Magento 2 zawierają funkcję o nazwie „mixins”. Mixin Magento 2 nie jest tym, co inżynier oprogramowania normalnie uważa za mixin / cechę . Zamiast tego, mixin Magento 2 pozwala modyfikować obiekt / wartość zwróconą przez moduł RequireJS, zanim ten obiekt / wartość zostanie wykorzystany przez program główny. Konfigurujesz mixin Magento 2 w ten sposób (za pomocą pliku requjs-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
}
}
}
};
Następnie musisz mieć hook.js
(lub dowolny skonfigurowany moduł RequireJS),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
zwraca funkcję. Magento wywoła tę funkcję, przekazując odwołanie do „modułu”, który chcesz zmodyfikować. W naszym przykładzie będzie to obiekt zwrócony przez moduł RequireJS Magento_Checkout/js/view/form/element/email
. Może to być również funkcja lub nawet wartość skalera (w zależności od tego, co zwraca moduł RequireJS).
Wygląda na to, mixins
że ten system jest wywoływany, ponieważ pozwala tworzyć zachowanie podobne do miksowania, jeśli obiekt zwrócony przez oryginalny moduł RequireJS obsługuje tę extend
metodę.
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Jednak sam system jest tylko sposobem na przyłączenie się do tworzenia obiektów modułowych.
Preambuła zakończona - czy ktoś wie, jak Magento wdrożyło tę funkcjonalność? Witryna RequireJS nie wydaje się wymieniać wtyczek (chociaż Google uważa, że możesz chcieć strony wtyczek RequireJS ).
Poza requirejs-config.js
plikami, podstawowy javascript Magento 2 wspomina tylko mixins
w trzech plikach
$ 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);
mixins.js
Plik wydaje się być RequireJS plugin (na podstawie !...
wzmianki w komentarzach - czy to prawda), ale nie jest to w 100% jasne, kiedy main.js
albo scripts.js
są wywoływane przez Magento, albo jak zwyczaj mixins
konfiguracja sprawia, że od requirejs-config.js
do słuchacza / system hakowy opisane powyżej.
Czy ktoś ma wyjaśnienie, w jaki sposób ten system został / jest wdrożony / opracowany, z myślą o możliwości debugowania, dlaczego „mixin” może być zastosowany?
mixins
konfiguracjax-magento-init
idata-mage-init
konfiguracje? tj. - w powyższym przykładzie zwróciłbyśpath/to/configuration-modifier
również wywołanie zwrotne, które mogłoby zmodyfikować dane konfiguracyjne? Albo coś innego?Aby zaokrąglić się Denis RUL za odpowiedź .
Tak więc, jeśli spojrzysz na stronę Magento, oto trzy
<script/>
tagi, które ładują Magento.Jest to sam RequireJS (
require.js
),mixins.js
wtyczka i scalona konfiguracja RequireJS (requirejs-config.js
).mixins.js
Plik definiuje RequireJS wtyczki. Ta wtyczka jest odpowiedzialna za ładowanie i wywoływanie modułów RequireJS, które nasłuchują instancji innych modułów RequireJS.Ta wtyczka zawiera również program RequJS po zdefiniowaniu wtyczki mixin.
Ten drugi ładunki programu sprawiedliwy zdefiniowane
mixins
plugin jako zależność, a następnie na nowo definiuje globalnerequire
,define
irequirejs
funkcje. Ta redefinicja pozwala systemowi „tak naprawdę nie mieszającemu” podłączyć się do początkowej instancji modułu RequireJS przed przekazaniem rzeczy z powrotem do zwykłych funkcji.źródło