나는이 인생 레거시 (legacy) 애플리케이션에 라이브러리 코드의 일부 기능을하는 IE10 + (없음 ES6 모듈로드 등)에 대한 작업을 할 필요가있다.
그러나 ES6 및 TypeScript를 사용할 React 앱을 개발하기 시작했으며 파일을 복제하지 않고 이미 가지고있는 코드를 재사용하고 싶습니다. 약간의 연구를 한 후에 UMD 패턴을 사용하여 이러한 라이브러리 파일을 <script src=*>
가져 오기 로 작동 하고 React 앱이 ES6 모듈로드를 통해 파일을 가져올 수있게하려고합니다.
나는 다음과 같은 변환을 생각해 냈습니다.
var Utils = (function(){
var self = {
MyFunction: function(){
console.log("MyFunction");
}
};
return self;
})();
에
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.Utils = {})));
}(this, (function (exports) {
exports.MyFunction = function(){
console.log("MyFunction");
};
})));
이를 통해 Import Utils from './Utils.js'
명령을 통해로드 하고 스크립트 태그를 사용하여 삽입 할 수 있습니다.<script src='Utils.js'></script>
그러나 내 IIFE 중 일부는 다른 IIFE를 종속성으로 사용합니다 (나쁘지만 현실입니다).
var Utils = Utils; // Used to indicate that there is dependency on Utils
var RandomHelper = (function(){
var self = {
DoThing: function(){
Utils.MyFunction();
}
};
return self;
})();
올바르게 설정 한 경우 RandomHelper
및 Utils
수입 할 수있는 파일에,이 응용 프로그램은이 기술과 호환되지 않습니다 반응한다. 간단하게
Import Utils from './Utils.js'
Import RandomHelper from './RandomHelper.js'
유틸리티가 창 범위가 아니라고 생각하기 때문에 작동하지 않습니다. 문제없이로드되지만 RandomHelper.DoThing()
Utils가 정의되어 있지 않습니다.
레거시 앱에서
<script src='Utils.js'></script>
<script src='RandomHelper.js'></script>
완벽하게 작동합니다.
RandomHelper가 React 앱에서 Utils를 사용하여 IE와 ES5를 호환 가능하게 유지하면서도 반응을 유지하려면 어떻게해야합니까? 아마도 어떻게 든 창 / 전역 변수를 설정합니까?
추신 : ES6 모듈 로딩의 요점은 종속성을 다루는 것이며 기존의 IIFE는 이상적이지 않다는 것을 알고 있습니다. 결국 es6 클래스와 더 나은 종속성 제어를 전환하려고하지만 지금은 다시 작성하지 않고 사용할 수있는 것을 사용하고 싶습니다.