#node.js #asp.net-mvc #angular #typescript #msbuild
#node.js #asp.net-mvc #angular #typescript #msbuild
Вопрос:
Фона
У меня есть ASP.NET Проект MVC, интегрированный с Angular2. Согласно Angular.io краткое руководство по запуску — я создал папку в моем файле решения со структурой 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
файлы, которые он находит в node_modules
папке. Это приводит к множеству ошибок и предотвращает сборку / публикацию решения.2
Вопрос
Я могу решить проблему, удалив все tsconfig.json
файлы, за исключением одного на корневом уровне моего проекта — если это так, MSBuild прекратит попытки скомпилировать зависимости AngularJS в node_modules
.
Но целесообразно ли это? Будут ли зависимости Angular2 работать корректно, если их tsconfig.json
файлы будут удалены, а их файлы Typescript не будут скомпилированы? Будет ли SystemJS в любом случае компилировать файлы Typescript?
1 Я использую Microsoft.Typescript.MSBuild
пакет NuGet для переноса .ts
файлов (tsc.exe версии v2.0.3) и NodeJS версии 6.x.
2 Я думаю, это потому, что до установки зависимостей Angular2 у меня есть один tsconfig.json
файл в корне моего проекта, но впоследствии он node_modules
содержит около десяти разных tsconfig.json
файлов — например, node_modulesbrowser-syncnode_modulesrxtstsconfig.json
.
Комментарии:
1. Я использую Asp.net MVC и angular2 вместе. Однако я никогда не разрабатываю проект ng2 с использованием Visual Studio (меня слишком раздражали такого рода проблемы). Скорее, я создаю свой проект с помощью angular-cli; разрабатываю проект в Visual Studio Code (что потрясающе). ЗАТЕМ, когда приходит время сборки для производства, я запускаю «ng build -prod» и использую gulp, чтобы скопировать все из папки «prod» в мой asp.net Проекта MVC. Не тот ответ, который вы искали, но подумали, что это может быть полезно.
Ответ №1:
Будут ли зависимости Angular2 работать корректно, если их файлы tsconfig.json будут удалены, а их файлы Typescript не будут скомпилированы?
Сторонние библиотеки уже распространяются как файлы JS. Это верно для любой сторонней библиотеки. Библиотеки, которые поддерживают TypeScript «из коробки», будут включать в себя файлы определения TypeScript (эти файлы заканчиваются на .d.ts
). Когда мы компилируем наши приложения, они компилируются по отношению к файлу определения, не к исходному ( .ts
) файлу. Файл определения предоставляет типизацию, достаточную для компиляции TypeScript. Нам никогда не придется касаться фактического исходного кода
Возможно, вы также заметили, что некоторые сторонние библиотеки JS не поддерживают TypeScript из коробки (.т. е. не распространяют набор текста в библиотеке). В этом случае нам нужно установить внешние сторонние типизации. Например, скажем, что мы используем Moment JS. Если вы установите npm install momemt
, вы заметите, что модуль не имеет файла typings. Итак, если мы хотим использовать Moment в TypeScript, мы бы это сделали npm install @types/moment
, и это предоставило бы нам типизацию для Moment.
Также, если вы хотите создать свою собственную библиотеку TypeScript, что бы вы сделали, это добавили compilerOptions.declaration: true
в свой tsconfig.json
файл. Когда проект будет скомпилирован, он создаст файлы определений для вас, так что вам не нужно записывать их вручную.
Вот как сторонние библиотеки используются / должны использоваться в TypeScript. Если бы мы не использовали файлы определений и всегда импортировали исходный код, то исходный код всегда компилировался бы, независимо от того, исключаете вы его из tsconfig или нет, поскольку от этого зависит код, который мы пишем. Поэтому вместо этого мы зависим от файлов определения. Когда вы импортируете в свой код проекта, то, что вы импортируете, на самом деле является файлом определения, а не исходным файлом.
Комментарии:
1. Это отвечает на часть моего вопроса — я слышал, что файлы .ts не нужно компилировать. Что насчет
tsconfig.json
файлов? MSBuild компилирует каждый.ts
файл, в котором он находитtsconfig.json
, даже вnode_modulesbrowser-syncnode_modulesrxtstsconfig.json
2. Этого не должно быть, если вы исключаете node_modules. Если это произойдет, это может быть специфическая проблема IDE (или любой другой MSBuild)
3. Я могу исключить
node_modules
из корняtsconfig
— имеет смысл. Однако переход кtsconfig
файлам зависимостей отдельных проектов Angular2 (которые используются MSBuild) и перезапись их всех с помощьюexclude
s кажется опасным.4. Я не знаю, я не использую MSBuild. Но при использовании глобального компилятора typescript от node у меня никогда не возникало проблем с использованием других файлов tsconfig.
5. 1, и это полностью имеет смысл в контексте экосистемы NodeJS. Однако мой вопрос на самом деле касается поведения MSBuild, когда оно пытается напоминать NodeJS, поэтому я соответствующим образом отредактировал заголовок своего вопроса.
Ответ №2:
Вам не следует компилировать файлы TypeScript в node_modules. Чтобы убедиться, что вы этого не сделаете, добавьте следующее в ваш файл tsconfig:
"exclude": [
"node_modules"
],
Публикация библиотеки в виде TypeScript считается плохой практикой, поскольку потребителю пришлось бы воссоздавать всю среду сборки, чтобы использовать ее — типы и все остальное. Потенциально вам также придется настроить таргетинг на определенную версию компилятора TypeScript.
Комментарии:
1. Так почему бы и нет? Я уже знаю, как исключить их из компиляции. Задокументирована ли где-нибудь причина этого?
2. Код, предоставляемый сторонними библиотеками, уже скомпилирован, вам не нужно делать это самостоятельно, и вы не должны
3. Я добавил еще немного информации