В объектных системах на основе RequireJS в Magento 2 есть функция, называемая «mixins». Миксин в Magento 2 - это не то, что инженер-программист обычно воспринимает как миксин / черта . Вместо этого, Maginto 2 mixin позволяет вам изменять объект / значение, возвращаемое модулем RequireJS, до того, как этот объект / значение будет использоваться основной программой. Вы настраиваете миксины Magento 2 следующим образом (через файл 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
}
}
}
};
Затем вам нужно иметь 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
вызывается, потому что она позволяет создавать миксиноподобное поведение, если объект, возвращаемый исходным модулем 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 ).
Вне requirejs-config.js
файлов ядро 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
также будет возвращать обратный вызов, который может изменить данные конфигурации? Или что-то другое?Завершить ответ Дениса Рула .
Итак, если вы посмотрите на страницу Magento, вот три
<script/>
тега, которые загружают Magento.Это сам RequireJS (
require.js
),mixins.js
плагин и объединенная конфигурация RequireJS (requirejs-config.js
).mixins.js
Файл определяет RequireJS плагин. Этот плагин отвечает за загрузку и вызов модулей RequireJS, которые прослушивают создание экземпляров других модулей RequireJS.Этот плагин также содержит программу requirejs после определения плагина mixin.
Эта вторая программа загружает только определенный
mixins
плагин , как зависимость, а затем переопределяет глобальнуюrequire
,define
иrequirejs
функцию. Это переопределение - это то, что позволяет системе «не совсем смешивать» подключиться к первоначальной реализации модуля RequireJS перед передачей вещей обратно обычным функциям.источник