Javascript 如何在Duktape中使用typescript模块
我试图在游戏引擎中使用JS作为脚本语言,并在顶部使用TypeScript。作为我使用的运行时。我完全不懂JavaScript,目前我正努力思考如何实现一个工作流,人们可以在其中包含(需要等)其他文件 出于测试目的,我从两个简单的TypeScript文件开始: Foo.tsJavascript 如何在Duktape中使用typescript模块,javascript,typescript,duktape,Javascript,Typescript,Duktape,我试图在游戏引擎中使用JS作为脚本语言,并在顶部使用TypeScript。作为我使用的运行时。我完全不懂JavaScript,目前我正努力思考如何实现一个工作流,人们可以在其中包含(需要等)其他文件 出于测试目的,我从两个简单的TypeScript文件开始: Foo.ts declare function Print(text : string) : void; export module Foo { export function GetFoo(): string {
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())
"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 = {}));
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo_1 = require("./Foo");
Print("Bar: " + Foo_1.Foo.GetFoo());
Bar.ts
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())
"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 = {}));
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo_1 = require("./Foo");
Print("Bar: " + Foo_1.Foo.GetFoo());
现在,我通过TypeScript的Transfile函数(从typescriptServices.js)实现了这两个功能,并获得:
Foo.js
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())
"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 = {}));
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo_1 = require("./Foo");
Print("Bar: " + Foo_1.Foo.GetFoo());
Bar.js
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())
"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 = {}));
"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:identifier'exports'undefined”
如前所述,我对JS和TS都是新手,可能对整个工作有错误的想法,所以请随意提出完全不同的方法。我所关心的是,用户可以将代码拆分为多个文件,并以某种方式引用这些文件,使诸如VS code之类的工具能够找出这些引用,并提供开发代码的功能。我不在乎我最终使用的是“require”还是“import”,也不在乎我是否可以使用所有TS功能或只是某个子集
长话短说,我做错了什么?我怎样才能做到这一点?昨晚晚些时候,我发现了我的问题所在,我将把它张贴在这里,以防有人遇到类似的问题 问题是TypeScript生成了为这两个文件设置“\uuuEsmodule”属性的代码。只有Foo.ts导出了任何内容,并在'require'调用中使用,但对于Bar.ts,传输的JS代码还希望访问'exports'对象 在Duktape中,当您使用duk_module_Duktape_init启用对“require”函数的支持时,它将生成一个“exports”对象,但仅在您执行实际的“require()”调用之后,当然也只会加载模块 这里的问题是顶级文件(不是通过require调用加载的)已经尝试访问此文件不存在的“exports”对象
解决方案很简单,就是创建一个虚拟对象,即通过在顶层脚本文件前加上'var exports={}。昨晚晚些时候,我发现了我的问题所在,我将在这里发布,以防任何人遇到类似问题 问题是TypeScript生成了为这两个文件设置“\uuuEsmodule”属性的代码。只有Foo.ts导出了任何内容,并在'require'调用中使用,但对于Bar.ts,传输的JS代码还希望访问'exports'对象 在Duktape中,当您使用duk_module_Duktape_init启用对“require”函数的支持时,它将生成一个“exports”对象,但仅在您执行实际的“require()”调用之后,当然也只会加载模块 这里的问题是顶级文件(不是通过require调用加载的)已经尝试访问此文件不存在的“exports”对象
解决方案非常简单,只需创建一个虚拟对象,即在顶层脚本文件前面加上'var exports={}'。这个问题可能需要反复解决。它应该与您拥有的代码一起工作,但是您也遗漏了很多东西。我建议从纯JS开始(请记住:duktape只支持ES5)。另请参阅我们的。这个问题可能需要反复解决。它应该与您拥有的代码一起工作,但是您也遗漏了很多东西。我建议从纯JS开始(请记住:duktape只支持ES5)。另见我们的报告。