Angular CLI 8. «ng serve» завершается ошибкой при использовании «paths» в tsconfig.json - PullRequest
0 голосов
/ 10 октября 2019

Я работаю над проектом, который включает в себя несколько различных интерфейсов на основе Angular 8. Каждый интерфейс представляет собой отдельный проект Angular 8 со своей собственной структурой папок. Все их корневые папки находятся в одной главной папке.

theproject
    |___ frontend1
    |___ frontend2
    ...

Чтобы избежать дублирования кода и оптимизировать рефакторинг кода, мы решили поместить повторяющийся код в «базовую» папку и импортировать его. с помощью опции пути, установленной в tsconfig.json.

theproject
    |___ frontend1/
    |___ frontend2/
    ...
    |___ base-ui/

Мы начали с простого класса, представляющего коллекции констант, которые используются во всем ландшафте внешнего интерфейса. Этот класс находится внутри файла constants.ts, который находится в папке base-ui/constants

theproject
    |___ frontend1/
    |___ frontend2/
    ...
    |___ base-ui/constants/constants.ts

Это наш tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "es2015",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ],
    "types": [
      "hammerjs",
      "jasmine"
    ],
    "paths": {
      "@shared/*": [
        "../base-ui/*"
      ]
    }
  }
}

И это оченьпростое содержимое constants.ts

export class BaseServerConstants {
    public static readonly LOGOUT_URL = 'server/logout';
    public static readonly LOGIN_URL = 'server/login';
}

Вот как мы импортируем / используем его

import { BaseServerConstants } from '@shared/constants/constants';

...

performLogout(): void {
    window.location.href = BaseServerConstants.LOGOUT_URL;
}

Это работает как шарм, если мы просто кодируем или строим проекты с ng build или ng build --prod.

Но использование ng serve внутри консоли кода IntelliJ или VS всегда приводит к одному и тому же сообщению об ошибке, которое гласит:

ERROR in /Users/developer/theproject/base-ui/constants/constants.ts
Module not found: Error: Can't resolve 'tslib' in '/Users/developer/theproject/base-ui/constants'

Почему это происходит? Почему я могу использовать эту опцию путей, чтобы импортировать очень простые классы из простых файлов TS, которые находятся за пределами baseUrl, и применять их при кодировании. И они также не вызывают ошибок компилятора при сборке конечного приложения! Приложения работают как ожидалось потом.

Но если этот код должен запускаться локально внутри NodeJS, он не скомпилируется ?!

Есть ли дополнительная опция, которую я должен установить?

Любая помощь или подсказка очень ценится!

1 Ответ

0 голосов
/ 24 октября 2019

Ну, я сам нашел решение.

Нужно просто поместить бочку (index.ts) во внешнюю папку и экспортировать интересующий файл. Таким образом, в моем случае это решило проблему, описанную выше:

theproject
    |___ frontend1/
    |___ frontend2/
    ...
    |___ base-ui/constants/constants.ts
    |___ base-ui/index.ts

Содержимое index.ts

export * from './constants/constants';

К сожалению, это работает до версии Angular 8.1.3. Более новые проекты, использующие Angular 8.2.7, сталкиваются с той же ошибкой, что и раньше ...

...