【问题标题】:How can I use an IIFE script in a Deno program?如何在 Deno 程序中使用 IIFE 脚本?
【发布时间】:2021-06-29 01:41:10
【问题描述】:

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

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

然后该模块与let mod=new ModuleName(); 一起使用。

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

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

任何建议将不胜感激。

【问题讨论】:

  • "我无法将其转换为 ES 模块" - 你不能更改构建过程吗?使用现代语法,为生产环境生成 ES3 目标模块,为 Deno 生成 TypeScript 模块。
  • 使用Function 构造函数(如Function(source + '\n return new moduleName;')())应该可以工作。你能告诉我们你究竟尝试了什么以及它是如何失败的吗?

标签: javascript module deno


【解决方案1】:

关键是用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; }
    }

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多