0

我正在尝试在游戏引擎中使用 JS 作为脚本语言,TypeScript 位于顶部。作为运行时,我使用Duktape。我是一个关于 JavaScript 的完全菜鸟,目前我正试图围绕我如何启用一个工作流来让人们可以#include(需要等)其他文件。

出于测试目的,我从两个简单的 TypeScript 文件开始:

declare function Print(text : string) : void;

export module Foo 
{
    export function GetFoo(): string 
    {
        return "Foo"
    }

    Print("Foo: " + GetFoo())
}

巴茨

import { Foo } from "./Foo"

declare function Print(text: string): void;

Print("Bar: " + Foo.GetFoo())

现在我通过 TypeScript 的 Transpile 函数(来自 typescriptServices.js)得到:

Foo.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo;
(function (Foo) {
    function GetFoo() {
        return "Foo";
    }
    Foo.GetFoo = GetFoo;
    Print("Foo: " + GetFoo());
})(Foo = exports.Foo || (exports.Foo = {}));

酒吧.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo_1 = require("./Foo");
Print("Bar: " + Foo_1.Foo.GetFoo());

然后我想通过 Duktape 执行 Bar.js。我读了这篇文章,所以我的理解是有多种方法可以使包含其他文件工作,但这个似乎专门使“require”函数工作,所以这听起来很适合 TypeScript 为我生成的 JS 代码。因此,我创建了一个 Duktape 上下文,在其上调用 duk_module_duktape_init 并注册了一个“modSearch”函数等。但在它实际到达 Bar.js 的“require”部分之前,Duktape 已经失败并显示消息“ReferenceError:标识符”出口未定义”

如前所述,我对 JS 和 TS 真的很陌生,可能对整个工作有错误的想法,所以请随意提出完全不同的方法。我所关心的是用户可以将代码拆分为多个文件,并以某种方式引用这些文件,以便 VS Code 等工具可以找出这些引用并提供它们的功能来开发代码。我不在乎我最终是使用“require”还是“import”,以及我是否可以使用所有 TS 功能或只是一些子集。

长话短说,我做错了什么,我怎样才能做到这一点?

4

1 回答 1

2

昨晚深夜,我弄清楚了我的问题是什么,我会在这里发布以防万一有人遇到类似问题。

问题是 TypeScript 生成了代码来为这两个文件设置 '__esModule' 属性。只有 Foo.ts 导出任何内容并在“require”调用中使用,但对于 Bar.ts,转译后的 JS 代码也希望访问“exports”对象。

在 Duktape 中,当您使用 duk_module_duktape_init 启用对“require”函数的支持时,它会生成一个“exports”对象,但只有在您通过实际的“require()”调用时才会生成,并且当然只是为了加载模块。

这里的问题是顶级文件(不是通过要求调用加载的)已经尝试访问此文件不存在的“导出”对象。

解决方案很简单,就是创建一个虚拟对象,即。通过将 'var exports = {}' 添加到顶级脚本文件。

于 2019-09-25T11:32:20.233 回答