Как скомпилировать проект 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.