ระบบวัตถุที่ใช้ RequireJS ของ Magento 2 นั้นมีคุณสมบัติที่เรียกว่า "มิกซ์อิน" วีโอไอพี 2 mixin ไม่ใช่สิ่งที่วิศวกรซอฟต์แวร์มักจะคิดว่าเป็นmixin / ลักษณะ Magento 2 mixin ช่วยให้คุณสามารถปรับเปลี่ยนวัตถุ / ค่าที่ส่งคืนโดยโมดูล RequireJS ก่อนที่โปรแกรมหลักจะใช้วัตถุ / ค่านั้น คุณกำหนดค่า mixento 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
(หรือโมดูลใดก็ตามที่คุณต้องการกำหนดค่า JJ)
define([], function(){
console.log("Hello");
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto;
};
});
ส่งคืนฟังก์ชัน Magento จะเรียกใช้ฟังก์ชันนี้ผ่านการอ้างอิงถึง "โมดูล" ที่คุณต้องการแก้ไข Magento_Checkout/js/view/form/element/email
ในตัวอย่างของเรานี้จะถูกวัตถุที่ส่งกลับโดยโมดูล RequireJS นี่อาจเป็นฟังก์ชั่นหรือแม้กระทั่งมูลค่าของเครื่องทำ Scaler
ระบบนี้ดูเหมือนจะถูกเรียก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
จะเรียกโดยวีโอไอพีหรือวิธีการที่กำหนดเองmixins
การกำหนดค่าทำจากrequirejs-config.js
เข้าฟังระบบ / เบ็ด อธิบายไว้ข้างต้น.
ใครบ้างมีคำอธิบายสำหรับวิธีการที่ระบบนี้ / ถูกนำไปใช้ / architected ด้วยตาต่อความสามารถในการแก้ปัญหาทำไม "mixin" อาจหรือไม่อาจนำไปใช้?
mixins
กำหนดค่าทำอะไรx-magento-init
และdata-mage-init
การกำหนดค่า? ie - ในตัวอย่างข้างต้นคุณจะpath/to/configuration-modifier
ส่งคืนการเรียกกลับที่สามารถแก้ไขข้อมูลการกำหนดค่าได้หรือไม่ หรืออย่างอื่น?