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?Untuk melengkapi jawaban Denis Rul .
Jadi, jika Anda melihat halaman Magento, berikut adalah tiga
<script/>
tag yang memuat Magento.Ini adalah RequireJS sendiri (
require.js
),mixins.js
plugin, dan konfigurasi RequireJS yang digabungkan (requirejs-config.js
).Itu
mixins.js
berkas mendefinisikan RequireJS Plugin. Plugin ini bertanggung jawab untuk memuat dan memanggil modul RequireJS yang mendengarkan instantiasi modul RequireJS lainnya.Plugin ini juga berisi program yang diperlukan setelah mendefinisikan plugin mixin.
Program kedua ini memuat
mixins
plugin yang baru saja didefinisikan sebagai dependensi, dan kemudian mendefinisikan kembali globalrequire
,define
danrequirejs
fungsinya. Redefinisi ini adalah apa yang memungkinkan sistem "not really a mixin" untuk menghubungkan ke instantiasi awal modul RequireJS sebelum meneruskan kembali ke fungsi biasa.sumber