Magento 2のRequireJSベースのオブジェクトシステムには、「ミックスイン」と呼ばれる機能が含まれています。Magento 2のミックスインは、ソフトウェアエンジニアが通常ミックスイン/特性と考えるものではありません。代わりに、Magento 2ミックスインを使用すると、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
メソッドをサポートしている場合にmixinのような動作を作成できるため、呼び出されているように見えます。
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 Webサイトでは、ミックスインについて言及していないようです(ただし、GoogleはRequireJSのプラグインページが必要かもしれないと考えています)。
requirejs-config.js
ファイル以外では、Magento 2のコアjavascript mixins
は3つのファイルでのみ言及しています
$ 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
、構成データを変更できるコールバックも返しますか?または、他の何か?