繁体   English   中英

如何在 Duktape 中使用 typescript 模块

[英]How to use typescript modules with Duktape

我正在尝试将 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 function(来自 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。 我读了这篇文章,所以我的理解是有多种方法可以使包括其他文件工作,但是这个似乎特别使“要求” function 工作,所以这听起来很适合 TypeScript 为我生成的 JS 代码。 因此,我创建了一个 Duktape 上下文,在其上调用 duk_module_duktape_init 并注册了一个“modSearch”function 等。但在它实际到达 Bar.js 的“require”部分之前,Duktape 已经失败并显示消息“ReferenceError:标识符”出口未定义”

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

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

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

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

In Duktape, when you use duk_module_duktape_init to enable support for the 'require' function, it will generate an 'exports' object but ONLY once you go through an actual 'require()' call and only for the module to be loaded of course.

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM