Как использовать машинописные модули с Duktape - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь использовать JS в качестве языка сценариев в игровом движке с TypeScript сверху.В качестве времени выполнения я использую Duktape .Я полный нуб в отношении JavaScript, и в настоящее время я пытаюсь обдумать, как включить рабочий процесс, в котором люди могут #include (требовать и т. Д.) Другие файлы.

В целях тестирования я начал с двух простыхФайлы TypeScript:

Foo.ts

declare function Print(text : string) : void;

export module Foo 
{
    export function GetFoo(): string 
    {
        return "Foo"
    }

    Print("Foo: " + GetFoo())
}

Bar.ts

import { Foo } from "./Foo"

declare function Print(text: string): void;

Print("Bar: " + Foo.GetFoo())

Теперь я пропускаю обаФункция транспонирования TypeScript (из 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 = {}));

Bar.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo_1 = require("./Foo");
Print("Bar: " + Foo_1.Foo.GetFoo());

Затем я хочу запустить Bar.js через Duktape.Я прочитал this , так что, насколько я понимаю, есть несколько способов заставить работать другие файлы, но этот, кажется, заставляет работать функцию 'require', поэтому для JS-кода это звучит правильно, так как TypeScriptсоздан для меня.Итак, я создаю контекст Duktape, я вызываю для него duk_module_duktape_init и регистрирую функцию 'modSearch' и т. Д. НО, прежде чем он даже доходит до части 'require' в Bar.js, Duktape уже дает сбой с сообщением "ReferenceError: identifier 'exports' undefined ".

Как уже упоминалось ранее, я действительно новичок в JS и TS и могу иметь неверное представление об этом начинании, поэтому не стесняйтесь предлагать совершенно разные подходы.Все, что меня волнует, - это то, что пользователи могут разбивать код на несколько файлов и каким-то образом ссылаться на эти файлы таким образом, чтобы такие инструменты, как VS Code, могли выяснить эти ссылки и предоставить свои функциональные возможности для разработки кода.Мне все равно, в конечном итоге я использую 'require' или 'import' и могу ли я использовать все функции TS или просто какое-то подмножество.

Короче говоря, что я делаю неправильно и как я могу это сделатьсделать эту работу?

1 Ответ

0 голосов
/ 25 сентября 2019

Поздно вечером я выяснил, в чем заключается моя проблема, я опубликую ее здесь на случай, если кто-нибудь столкнется с подобной проблемой.

Проблема в том, что TypeScript сгенерировал код для установки свойства '__esModule'для обоих файлов.Только Foo.ts экспортировал что-либо и использовался в вызове 'require', но для Bar.ts переданный JS-код также хочет получить доступ к объекту 'export'.

В Duktape, когда вы используете duk_module_duktape_init для включенияподдержка функции 'require', она будет генерировать объект 'export', но ТОЛЬКО после того, как вы выполните фактический вызов 'require ()' и, конечно, только для загрузки модуля.

Проблема здесьявляется то, что уже файл верхнего уровня (который не загружается с помощью require-call) пытается получить доступ к объекту «export», который не существует для этого файла.

Решение заключается в простом создании фиктивногообъект, т.е.добавив 'var exports = {}' в файл сценария верхнего уровня.

...