是否有必要让MSBuild在Angular2的依赖项(在node_modules中)中转换.ts文件以使Angular2工作?

时间:2016-10-24 20:38:43

标签: node.js asp.net-mvc angular typescript msbuild

背景

我有一个与Angular2集成的ASP.NET MVC项目。根据{{​​3}}快速入门指南 - 我在解决方案文件中使用默认的Angular2结构创建了一个文件夹......

├── app
|   └── ...
├── node_modules
|   └── ...
├── typings
|   └── ...
| systemjs.config.js
| tsconfig.json
| typings.json
| package.json

...以及默认的package.json文件:

"dependencies": {
  "@angular/common": "2.0.0",
  "@angular/compiler": "2.0.0",
  "@angular/core": "2.0.0",
  "@angular/forms": "2.0.0",
  "@angular/http": "2.0.0",
  "@angular/platform-browser": "2.0.0",
  "@angular/platform-browser-dynamic": "2.0.0",
  "@angular/router": "3.0.0",
  "@angular/upgrade": "2.0.0",
  "core-js": "^2.4.1",
  "reflect-metadata": "^0.1.3",
  "rxjs": "5.0.0-beta.12",
  "systemjs": "0.19.27",
  "zone.js": "^0.6.23",
  "angular2-in-memory-web-api": "0.0.20",
  "bootstrap": "^3.3.6"
},
"devDependencies": {
  "concurrently": "^2.2.0",
  "lite-server": "^2.2.2",
  "typescript": "^2.0.2",
  "typings":"^1.3.2"
}

然后我使用npm install命令将Angular2的依赖项安装到node_modules文件夹中。

问题

我的问题的根源是MSBuild正在尝试编译整个项目中的每个.ts文件。 1 这些文件包含它在{{{}中找到的.ts个文件1}}文件夹。这会引发很多错误并阻止构建/发布解决方案。 2

问题

我可以通过删除除项目根级别之外的所有node_modules文件来解决问题 - 如果是这样,MSBuild将停止尝试编译AngularJS' tsconfig.json中的依赖关系。

但这是否可行?如果Angular2依赖项被删除node_modules文件并且它们的Typescript文件没有被编译,它们是否会正常工作? SystemJS会编译Typescript文件吗?

1 我使用tsconfig.json NuGet包来转发Microsoft.Typescript.MSBuild个文件(tsc.exe v2.0.3)和NodeJS v6.x.

2 我认为这是因为之前安装了Angular2依赖项,我的项目根目录中只有一个.ts文件 - 但是之后tsconfig.json包含十个不同的node_modules文件 - 例如tsconfig.json

2 个答案:

答案 0 :(得分:3)

  

如果删除了tsconfig.json文件并且未编译其Typescript文件,Angular2依赖项是否会正常工作?

第三方库已作为JS文件分发。任何第三方库都是如此。支持TypeScript开箱即用的库将包含TypeScript Definition Files(这些文件以.d.ts结尾)。当我们编译应用程序时,它们会针对定义文件而不是源(.ts)文件进行编译。定义文件提供了足以让TypeScript编译的输入。我们永远不应该触及实际的源代码

您可能也注意到某些第三方JS库不支持开箱即用的TypeScript(例如,不要在库中分发输入)。在这种情况下,我们需要安装外部第三方类型。例如,假设我们正在使用Moment JS。如果您安装npm install momemt,您会注意到该模块没有打包文件。因此,如果我们想在TypeScript中使用Moment,我们会npm install @types/moment,这将为我们提供Moment的输入。

此外,如果您想创建自己的TypeScript库,您要做的是将compilerOptions.declaration: true添加到tsconfig.json文件中。编译项目时,它会为您创建定义文件,因此您无需手动编写它们。

这就是TypeScript中应该使用第三方库的方式。如果我们没有使用定义文件,并且总是导入源,那么无论是否将它从tsconfig中排除,源都将被编译,因为我们编写的代码依赖于它。所以我们依赖于定义文件。导入项目代码时,您导入的内容实际上是定义文件,而不是源文件。

答案 1 :(得分:0)

您不应该在node_modules下编译TypeScript文件。为确保不要,请将以下内容添加到tsconfig文件中:

"exclude": [
    "node_modules"
  ],

将库作为TypeScript发布被认为是一种不好的做法,因为消费者必须重新创建整个构建环境才能使用它 - 类型和所有。您可能还必须针对特定版本的TypeScript编译器。