【问题标题】:How to compile a nodejs Typescript project with classes in separate files within NTVS?如何在 NTVS 中使用单独文件中的类编译 nodejs Typescript 项目?
【发布时间】:2015-12-06 16:22:32
【问题描述】:

NTVS = Visual Studio 的节点工具

我创建了一个以 server.js 作为主文件的新项目。然后创建了几个类,每个类都在他们的文件中。所有这些文件都在references.ts 文件中引用。

所有文件都包含对references.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" />

如果编译时没有 combine 选项,这是 node.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...

如果我使用 combine 选项,什么都不会发生,因为生成的文件只包含类声明。

【问题讨论】:

    标签: node.js typescript ntvs


    【解决方案1】:

    在“主文件”的顶部(应该是“server.ts”——一个 TypeScript 文件——而不是你提到的“server.js”),你应该引用你的“references.ts”文件,它有您对所有其他 TypeScript 文件的引用:

    //
    //server.ts
    
    ///<reference path='./references.ts' />
    
    //Program Code...
    

    在 ASP.NET 项目中,项目设置中有一个“TypeScript Build”部分,您可以在其中选择“将 JavaScript 输出合并到文件中”,然后将“server.js”放入其中。

    不幸的是,NTVS 人员似乎没有在他们自己的项目设置中添加任何类似的功能,因此您必须实施自己的预构建流程才能使其在该环境中工作,直到他们提供一些正式的方式支持这一点。

    作为替代方案,您可以使用 BeforeBuild 步骤编译 server.js 文件。您需要手动编辑您的 .proj 文件(或 .njsproj 文件)并在最后一行(即项目文件中的倒数第二行)之前放置类似以下内容:

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

    “ReferencedFile1”等是您尝试包含在最终 server.js 文件中的文件。您应该查看正常构建的输出,以了解通常将哪些参数传递给 tsc.exe。

    【讨论】:

    • “设置为 Nodejs 启动文件”选项仅适用于 .js 文件。我已经按照你说的做了……它不起作用。我在我的问题中添加了详细信息。 (谢谢你的回答)
    • TypeScript 文件需要合并到最终的 server.js 文件中(使用 tsc 编译器的 --out 命令行参数)。尝试手动运行“tsc --out server.js server.ts Classes/HtmlElement.ts”,然后运行 ​​server.js 文件。您应该查看 server.js 以验证您的 HtmlElement 代码是否已包含在内。
    • 如何添加 --out 以便在我按 F5 时使用它?
    • 看起来这是 Visual Studio 的 Node Tools 的限制。我看不到任何自动执行此操作的方法,因此您必须手动执行此操作。我可能会将此作为 NTVS 人员的问题。
    • 编辑了我的答案以反映 NTVS 项目设置中没有“TypeScript Build”部分的事实。
    【解决方案2】:

    “将 Javascript 输出合并到文件中”选项不适用于包含导入指令的文件。

    你可以替换

    import http = require('http');
    

    通过

    var http = require('http');
    

    然后 server.ts 将被合并,一切正常。

    您现在可以为每个类创建一个文件并使用

    var instance=new MyClass();

    在我看来,Wich 是一种更方便的语法。

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 2019-05-18
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多