У мене є функції IIFE для деякого коду бібліотеки у застарілому додатку, який повинен працювати для IE10 + (Не завантажується модуль ES6 тощо).
Однак я починаю розробляти додаток React, який використовуватиме ES6 та TypeScript, і я хочу повторно використовувати код, який у мене вже є, не дублюючи файли. Після невеликих досліджень я виявив, що хотів би використовувати шаблон 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'
не працює, тому що я вважаю, що Utils не має вікон. Він завантажиться без проблем, але RandomHelper.DoThing()
призведе до того, що Utils не визначено.
У застарілому додатку
<script src='Utils.js'></script>
<script src='RandomHelper.js'></script>
працює бездоганно
Як я можу RandomHelper мати можливість використовувати утиліти в додатку React, підтримуючи сумісність IE та ES5, але все ще працює в реакції. Можливо, якось встановити вікно / глобальну змінну?
PS: Я розумію, що сенс завантаження модуля ES6 - це впоратися із залежностями, і мої існуючі IIFE не є ідеальними. Я планую врешті-решт переключити класи es6 та покращити контроль залежності, але поки що я хочу використовувати те, що є, без переписування