Magento 2的基于RequireJS的对象系统包含一个称为“ mixins”的功能。Magento 2 mixin不是软件工程师通常认为的mixin / trait。相反,Magento 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网站上似乎没有提到mixins(尽管Google认为您可能需要RequireJS的插件页面)。
在requirejs-config.js
文件之外,Magento 2的核心javascript仅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
成为听者/挂机系统如上所述。
有没有人对这个系统的实现/实现/架构有任何解释,以期能够调试为什么可能会或可能不会使用“ mixin”?
mixins
配置在做什么x-magento-init
以及data-mage-init
配置如何?即-在您上面的示例中,path/to/configuration-modifier
还会返回可以修改配置数据的回调吗?或者是其他东西?