javascript - 如何在 Duktape 中使用 typescript 模块
问题描述
我正在尝试在游戏引擎中使用 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 功能或只是一些子集。
长话短说,我做错了什么,我怎样才能做到这一点?
解决方案
昨晚深夜,我弄清楚了我的问题是什么,我会在这里发布以防万一有人遇到类似问题。
问题是 TypeScript 生成了代码来为这两个文件设置 '__esModule' 属性。只有 Foo.ts 导出任何内容并在“require”调用中使用,但对于 Bar.ts,转译后的 JS 代码也希望访问“exports”对象。
在 Duktape 中,当您使用 duk_module_duktape_init 启用对“require”函数的支持时,它会生成一个“exports”对象,但只有在您通过实际的“require()”调用时才会生成,并且当然只是为了加载模块。
这里的问题是顶级文件(不是通过要求调用加载的)已经尝试访问此文件不存在的“导出”对象。
解决方案很简单,就是创建一个虚拟对象,即。通过将 'var exports = {}' 添加到顶级脚本文件。
推荐阅读
- python - 使用 sha512_crypt 解密密码 - python3
- symmetricds - 初始加载在 sym_x 表模式中创建我的表
- android - Notification is coming sometimes and sometimes not coming when the app is in foreground using firebase notifications in Flutter for android
- mysql - Names of months as names of columns in MySQL
- android - RX How to subscribe only to specific events on a Subject
- python - 通过 Wikipedia 构建语料库:ModuleNotFoundError: No module named 'gensim'
- c++ - 使用 QXmlStreamReader 解析 XSD
- c++ - 将 lambda 用于回调函数作为 C 函数参数
- javascript - 这个倒计时的执行顺序是什么?
- heroku - Heroku 无法生成分发要求 -lotly 2.7.0