Magento 2의 RequireJS 기반 객체 시스템에는 "mixins"라는 기능이 있습니다. Magento 2 mixin은 소프트웨어 엔지니어가 일반적으로 mixin / trait 로 생각하는 것이 아닙니다 . 대신 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
메소드를 지원하는 경우 믹스 인과 유사한 작동을 작성할 수 있도록 호출 된 것으로 보입니다 .
define([], function(){
'use strict';
console.log("Hello");
var mixin = {
ourExtraMethod = function(){
//...
}
};
return function(theObjectReturnedByTheModuleWeAreHookingInto){
console.log(theObjectReturnedByTheModuleWeAreHookingInto);
console.log("Called");
return theObjectReturnedByTheModuleWeAreHookingInto.extend(mixin);
};
});
그러나 시스템 자체는 모듈 객체 생성에 연결하는 방법 일뿐입니다.
서문 완료 - 아는 사람 않는 방법 젠토이 기능을 구현했습니다? 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
리스너 / 후크 시스템으로 전술 한 바와.
"mixin"이 적용되거나 적용되지 않는 이유를 디버그 할 수 있도록이 시스템이 어떻게 구현 / 구현 / 건축되었는지에 대한 설명이 있습니까?
mixins
구성x-magento-init
과data-mage-init
구성에서 무엇을하는 것입니까? 즉, 위의 예path/to/configuration-modifier
에서 구성 데이터를 수정할 수있는 콜백을 반환합니까? 또는 다른 것?