首页 > 解决方案 > 如何在 Deno 程序中使用 IIFE 脚本?

问题描述

我们有一个当前必须以 ES3 为目标的 JS 库,因为生产产品使用带有旧 JS 引擎的工具,这是不可协商的。但是我需要能够在 Deno 中使用这个库,而且我不能将它转换为 ES 模块。该库目前正在使用函数闭包模块,ala Crockford,其中每个源都是一个构造函数,如下所示:

function ModuleName() { 
"use strict";
...
}

然后该模块与let mod=new ModuleName();.

有什么办法可以在 deno 中使用这些?我不在乎如何,确切地说——eval如果需要,我可以加载脚本和它,但最好只使用某种形式的导入。

我已经尝试以各种形式加载脚本文件并使用eval和使用Function,以及import记录的每个变体。我搜索了 Deno 文档并尝试了所有我能想到的搜索。一切都无济于事。

任何建议,将不胜感激。

标签: javascriptmoduledeno

解决方案


关键是包装源文件Function(return (+ ... +);)()以获取对模块构造函数的引用,然后可以构造该函数。我对更好的想法持开放态度,但这适用于我的情况。

function createModule(pthORurl, ...args) {
    try {
        let mod = Function("return ("+Deno.readTextFileSync(pthORurl)+");")();
        if(typeof(mod)!=="function") { throw Error("Loaded module is type '"+typeof(mod)+"' not type 'function'"); }
        mod = new mod(...args);
        if(typeof(mod)!=="object") { throw Error("Loaded module is type '"+typeof(mod)+"' not type 'object'"); }
        return mod;
        }
    catch(err) { err.message += " (loading "+pthORurl+")"; throw err; }
    }

推荐阅读