簡體   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