Par*_*roX 8 javascript iife reactjs
对于具有旧版应用程序的某些库代码,我具有IIFE函数,这些代码需要适用于IE10 +(无需加载ES6模块等)。
但是,我开始开发一个将使用ES6和TypeScript的React应用,并且我想重用我已经拥有的代码而不复制文件。经过一番研究,我发现我想使用UMD模式来允许这些库文件既可以用作<script src=*>导入,又可以让React应用通过ES6模块加载来导入它们。
我想出了以下转换:
var Utils = (function(){
var self = {
MyFunction: function(){
console.log("MyFunction");
}
};
return self;
})();
Run Code Online (Sandbox Code Playgroud)
至
(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");
};
})));
Run Code Online (Sandbox Code Playgroud)
这将允许通过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;
})();
Run Code Online (Sandbox Code Playgroud)
如果正确地将RandomHelper其Utils转换为可以导入的文件,则React应用程序与此技术不兼容。简单地做
Import Utils from './Utils.js'
Import RandomHelper from './RandomHelper.js'
Run Code Online (Sandbox Code Playgroud)
不起作用,因为我认为Utils不在窗口范围内。它将加载而不会出现问题,但RandomHelper.DoThing()会抛出未定义实用程序的情况。
在旧版应用中
<script src='Utils.js'></script>
<script src='RandomHelper.js'></script>
Run Code Online (Sandbox Code Playgroud)
完美地工作。
我如何让RandomHelper能够在React应用程序中使用Utils,使其与IE和ES5兼容,但仍可以在react中工作。也许以某种方式设置窗口/全局变量?
PS:我知道ES6模块加载的重点是处理依赖关系,而我现有的IIFE并不理想。我计划最终切换es6类和更好的依赖关系控制,但现在我想使用可用的内容而无需重写
让我们首先解决这个问题,模块功能如果没有显式导出,则私有范围仅限于定义的 module。你无法回避这个事实。但您可以考虑一些解决方法。
对遗留代码进行最小更改的解决方法是简单地将Utils和添加RandomHelper到window对象中。例如,更改var Utils = (...)();为window.Utils = (...)();. 因此,旧代码(通过加载)和较新的代码库都可以从全局对象访问该对象import。
应创建一个新的 ES6 模块作为加载遗留脚本的代理:
// ./legacy-main.js
const utilsScript = await fetch( './Utils.js' )
const randomHelperScript = await fetch( './RandomHelper.js' )
const utilsScriptText = await utilsScript.text()
const randomHelperScriptText = await randomHelperScript.text()
// Support access to `Utils` via `import`
export const Utils = Function( `${utilsScriptText}; return Utils;` )()
// Additionally support access via global object
Object.defineProperty(window, 'Utils', { value: Utils })
// Support access to `RandomHelper` via `import`
// Note that `Utils` which is a dependency for `RandomHelper` ought to be explicitly injected
// into the scope of execution of `RandomHelper`.
export const RandomHelper = Function( 'Utils', `${randomHelperScriptText}; return RandomHelper;` )( Utils )
// Additionally support access via global object
Object.defineProperty(window, 'RandomHelper', { value: RandomHelper })
Run Code Online (Sandbox Code Playgroud)
最后,您可以在需要时导入Utils和RandomHelper来自legacy-main.js:
import { Utils, RandomHelper } from './legacy-main.js'
Utils.MyFunction()
RandomHelper.DoThing()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |