我有一个与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
。
答案 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编译器。