У меня есть веб-приложение с серверным приложением NodeJS и клиентским приложением Angular 7. Я использую одни и те же типы компонентов серверная и клиентская части, поэтому у меня есть интерфейсы в папке node_modules вне обоих проектов:
repos/myWebApp/
client/
node_modules/
@angular/
...
src/
app/
app.module.ts
...
tsconfig.app.json
angular.json
package.json
tsconfig.json
node_modules/
shared/
classes/
sharedBase.ts
...
interfaces/
sharedBase.interface.ts
sharedModels.interface.ts
...
node_modules/
mongoose/
...
package.json
server/
src/
index.ts
...
package.json
tsconfig.json
Я занимаюсь разработкой с использованием Visual Studio Community 2017 (15.8.9). Когда я компилирую серверное приложение, у меня есть целые задачи, которые копируют общие классы из модуля общего узла в папки клиента и сервера. Все работало нормально, пока пару дней назад случайным образом Webpack в AngularCLI не дал мне сообщение об ошибке компиляции, что sharedModels.interface.ts отсутствует в компиляции TypeScript. Вот tsconfig.json моего клиента:
{
"compileOnSave": false,
"compilerOptions": {
"outDir": "./dist/out-tsc",
"baseUrl": "src",
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "esnext",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"esnext",
"es2017",
"dom"
]
}
}
Я могу исправить ошибку AngularCLI, добавив "include": [ "../node_modules/shared/*" ]
к клиентскому tsconfig.json, но затем разрешение модуля в VS нарушается. Более конкретно:
// adding the "include" breaks imports like these, i.e. VS "cannot find module ___"
import { Component } from '@angular/core';
import { ISharedModels } from 'shared/interfaces/sharedModels.interface';
// imports like these, however, still work in VS
import { BaseComponent } from 'app/components/base.component';
Я не уверен, что это проблема самой VS, расширений TypeScript, которые я использую в VS, TypeScript, Angular, AngularCLI, их комбинации или просто несоответствия между ними. Я попытался изменить свой baseURL, добавить пути к compilerOptions, указать «файлы» вместо «include» и другие параметры tsconfig, и я не могу вернуться к сценарию, когда и VS, и AngularCLI счастливы. Я все еще не уверен, что изменилось, чтобы заставить их больше не сотрудничать; с этими настройками они работали последние несколько месяцев (я обновил до Angular 7 несколько недель назад).