我为需要为 IE10+ 工作的遗留应用程序中的一些库代码提供了IIFE函数(没有 ES6 module加载等)。
但是,我开始开发一个将使用 ES6 和 TypeScript 的 React 应用程序,我想重用我已有的代码而不复制文件。经过一些研究,我发现我想使用 UMD 模式来允许这些库文件作为<script src=*>
导入工作,并允许 React 应用程序通过 ES6 module加载导入它们。
我想出了以下转换:
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 应用程序中使用 Utils,使其与 IE 和 ES5 兼容,但仍然可以在 React 中工作。也许以某种方式设置窗口/全局变量?
PS:我理解 ES6 module加载的目的是处理依赖项,而我现有的 IIFE 并不理想。我计划最终切换 es6 类和更好的依赖项控制,但现在我想使用可用的东西而无需重写