Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Duktape中使用typescript模块_Javascript_Typescript_Duktape - Fatal编程技术网

Javascript 如何在Duktape中使用typescript模块

Javascript 如何在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 {

我试图在游戏引擎中使用JS作为脚本语言,并在顶部使用TypeScript。作为我使用的运行时。我完全不懂JavaScript,目前我正努力思考如何实现一个工作流,人们可以在其中包含(需要等)其他文件

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

Foo.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());
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)。另见我们的报告。