Об'єктні системи на базі Magento 2 містять функцію під назвою "міксин". Magento 2 mixin - це не те, що програмний інженер зазвичай вважає міксом / ознакою . Натомість Magento 2 mixin дозволяє змінювати об'єкт / значення, повернені модулем RequireJS до того, як цей об'єкт / значення буде використаний основною програмою. Ви налаштуєте Magento 2 mixin так (через файл 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
}
}
}
};
Тоді вам потрібно мати hook.js
(або будь-який модуль RequireJS, який ви налаштували),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
повернути функцію. Magento викликає цю функцію, передаючи посилання на "модуль", який ви хочете змінити. У нашому прикладі це буде об’єкт, повернутий модулем RequireJS Magento_Checkout/js/view/form/element/email
. Це також може бути функція або навіть масштабне значення (залежно від того, що повертає модуль RequireJS).
Здається, ця система називається mixins
тому, що вона дозволяє створювати поведінку типу mixin, якщо об'єкт, повернений оригінальним модулем RequireJS, підтримує extend
метод.
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Однак сама система є лише способом підключення до створення об'єктів модулів.
Преамбула закінчена - хтось знає, як Magento реалізував цю функціональність? Веб-сайт RequireJS , схоже, не згадує міксин (хоча Google вважає, що ви можете захотіти сторінку плагіна ).
Поза межами requirejs-config.js
файлів, основний javascript Magento 2 згадує лише про mixins
три файли
$ 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
Файл , як видається RequireJS плагіна (на основі !...
згадок в коментарях - це право) , але це не 100% ясно , коли main.js
або scripts.js
викликається Magento, або як призначені для користувача mixins
настройки роблять його з requirejs-config.js
в систему слухача / гачку описано вище.
Хтось має пояснення того, як ця система була / впроваджена / архітектурована, маючи на увазі можливість виправити помилки, чому "міксин" може бути застосований чи не може застосовуватися?
mixins
конфігураціяx-magento-init
таdata-mage-init
конфігурації? тобто - у наведеному вище прикладіpath/to/configuration-modifier
також повертається зворотний виклик, який може змінювати дані конфігурації? Або щось інше?