Sistem objek berbasis RequireJS Magento 2 berisi fitur yang disebut "mixins". Mixin Magento 2 bukan apa yang biasanya dianggap oleh insinyur perangkat lunak sebagai mixin / sifat . Sebagai gantinya, mixin Magento 2 memungkinkan Anda untuk memodifikasi objek / nilai yang dikembalikan oleh modul RequireJS sebelum objek / nilai tersebut digunakan oleh program utama. Anda mengonfigurasi mixin Magento 2 seperti ini (melalui file requireejs-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
}
}
}
};
Kemudian, Anda harus memiliki hook.js
(atau modul RequireJS apa pun yang telah Anda konfigurasi),
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
mengembalikan fungsi. Magento akan memanggil fungsi ini, meneruskan referensi ke "modul" yang ingin Anda modifikasi. Dalam contoh kita ini akan menjadi objek yang dikembalikan oleh modul RequireJS Magento_Checkout/js/view/form/element/email
. Ini juga bisa berupa fungsi, atau bahkan nilai scaler (tergantung pada apa yang dikembalikan modul RequireJS).
Sistem ini tampaknya dipanggil mixins
karena memungkinkan Anda untuk membuat perilaku seperti mixin jika objek yang dikembalikan oleh modul RequireJS asli mendukung extend
metode ini.
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
Namun, sistem itu sendiri hanyalah cara untuk menghubungkan ke pembuatan objek modul.
Pembukaan selesai - apakah ada yang tahu bagaimana Magento telah menerapkan fungsi ini? Situs web RequireJS tampaknya tidak menyebutkan mixin (meskipun Google berpikir Anda mungkin ingin halaman plugin RequireJS ).
Di luar requirejs-config.js
file, javascript inti Magento 2 hanya menyebutkan mixins
dalam tiga file
$ 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);
The mixins.js
file muncul menjadi RequireJS Plugin (berdasarkan !...
menyebutkan di komentar -? Apakah ini benar) tapi itu tidak 100% jelas kapan main.js
atau scripts.js
dipanggil oleh Magento, atau bagaimana kebiasaan mixins
konfigurasi membuatnya dari requirejs-config.js
ke pendengar / sistem hook dijelaskan di atas.
Adakah yang memiliki penjelasan tentang bagaimana sistem ini diimplementasikan / diarsipkan, dengan tujuan untuk dapat men-debug mengapa "mixin" dapat diterapkan atau tidak?
mixins
konfigurasix-magento-init
dandata-mage-init
konfigurasi? yaitu - pada Anda contoh di atas, apakah akanpath/to/configuration-modifier
mengembalikan panggilan balik yang dapat mengubah data konfigurasi? Atau sesuatu yang lain?