Ho alcune funzioni IIFE per parte del codice della libreria in un'applicazione legacy che deve funzionare per IE10 + (nessun caricamento del modulo ES6, ecc.).
Tuttavia, sto iniziando a sviluppare un'app React che utilizzerà ES6 e TypeScript e voglio riutilizzare il codice che già ho senza duplicare i file. Dopo un po 'di ricerche ho scoperto che avrei voluto utilizzare un modello UMD per consentire a questi file di libreria di funzionare sia come <script src=*>
importazioni sia per consentire all'app React di importarli tramite il caricamento del modulo ES6.
Ho pensato alla seguente conversione:
var Utils = (function(){
var self = {
MyFunction: function(){
console.log("MyFunction");
}
};
return self;
})();
per
(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");
};
})));
Ciò consentirà il caricamento tramite Import Utils from './Utils.js'
comando e consentirà inoltre di inserirlo utilizzando un tag di script<script src='Utils.js'></script>
Tuttavia, alcuni dei miei IIFE usano altri IIFE come dipendenza (male lo so, ma una realtà).
var Utils = Utils; // Used to indicate that there is dependency on Utils
var RandomHelper = (function(){
var self = {
DoThing: function(){
Utils.MyFunction();
}
};
return self;
})();
Se trasforma correttamente RandomHelper
e Utils
in file che possono essere importati, l'app React non è compatibile con questa tecnica. Facendo semplicemente
Import Utils from './Utils.js'
Import RandomHelper from './RandomHelper.js'
non funziona perché credo che Utils non abbia una finestra. Si caricherà senza problemi ma RandomHelper.DoThing()
genererà che Utils non è definito.
Nell'app legacy
<script src='Utils.js'></script>
<script src='RandomHelper.js'></script>
funziona perfettamente.
Come posso avere RandomHelper in grado di usare Utils in un'app React, mantenendola compatibile con IE ed ES5 ma ancora reagendo. Forse in qualche modo l'impostazione di una finestra / variabile globale?
PS: capisco che il punto del caricamento del modulo ES6 è gestire le dipendenze e i miei IIFE esistenti non sono ideali. Ho intenzione di cambiare eventualmente le classi es6 e un migliore controllo delle dipendenze, ma per ora voglio usare ciò che è disponibile per essere senza riscrivere