Как скомпилировать проект Typescript nodejs с классами в отдельных файлах в NTVS?

NTVS = Node Tools для Visual Studio

Я создал новый проект с server.js в качестве основного файла. Затем создали несколько классов, каждый в своем файле. Все эти файлы упоминаются в файле reference.ts.

Все файлы содержат ссылку на reference.ts.

Однако мой проект не запускается. Это говорит о том, что некоторых классов не существует.

Поэтому я отмечаю "Объединить вывод Javascript в файл", но код из server.ts не добавляется в результирующий файл (все классы там жесткие).

Как я могу использовать внутренние ссылки?

Редактировать: вот файлы, которые я использую

server.ts

/// <reference path="references.ts"/>

import http = require('http');

var html = new HtmlElement('html');
...

Классы / HtmlElement.ts

class HtmlElement {
    tag: string;
    attributes: Array<HtmlAttribute>;
    childrens: Array<HtmlElement>;
    parent: HtmlElement;
    text: string;
...

references.ts

/// <reference path="Scripts/typings/node/node.d.ts" />
/// <reference path="Classes/HtmlElement.ts" />

Если компиляция без опции объединения, это вывод окна window.js:

debugger listening on port 5858

C:\Zdisk\Projets\14 08 - QCM\NodeJsTypeScript1\ServerApp\server.js:5
var html = new HtmlElement('html');
               ^
ReferenceError: HtmlElement is not defined
    at Object.<anonymous     (C:\Projects\NodeJsTypeScript1\Server
App\server.js:5:16)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain [as _onTimeout] (module.js:497:10)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Press any key to continue...

Если я использую параметр объединения, ничего не происходит, потому что результирующий файл содержит только объявление классов.

2 ответа

Решение

Опция "Объединить вывод JavaScript в файл" не работает для файлов, содержащих директиву импорта.

Вы можете заменить

import http = require('http');

от

var http = require('http');

Тогда server.ts будет объединен, и все работает нормально.

Теперь вы можете создать один файл для каждого класса и создать его, используя

var instance=new MyClass();

У меня гораздо более удобный синтаксис, по моему мнению.

В верхней части вашего "основного файла" (который должен быть "server.ts" - файл TypeScript, а не "server.js", как вы упомянули), вы должны ссылаться на ваш файл "reference.ts", в котором есть ваши ссылки на все остальные ваши файлы TypeScript:

//
//server.ts

///<reference path='./references.ts' />

//Program Code...

В проекте ASP.NET есть раздел "Сборка TypeScript" настроек проекта, где вы можете выбрать "Объединить вывод JavaScript в файл" и добавить туда "server.js".

К сожалению, похоже, что ребята из NTVS не добавили подобную функциональность в свои собственные настройки проекта, поэтому вам придется реализовать собственный процесс предварительной сборки, чтобы заставить его работать в этой среде, пока они не предоставят какой-то формальный способ поддержки этого.,

В качестве альтернативы вы можете скомпилировать файл server.js, используя шаг BeforeBuild. Вам необходимо вручную отредактировать файл.proj (или файл.njsproj) и поместить что-то вроде следующего справа ДО последней строки (то есть, от последней до последней строки в файле проекта):

<Target Name="BeforeBuild">
    <Exec Command="tsc.exe --module CommonJS --sourcemap --target ES5 --out server.js <ReferencedFile1> <...>" />
</Target>

Где "ReferencedFile1" и т. Д. - это файлы, которые вы пытаетесь включить в окончательный файл server.js. Вы должны посмотреть на вывод вашей обычной сборки, чтобы увидеть, какие аргументы обычно передаются в tsc.exe.

Другие вопросы по тегам