Избегание относительных путей в Angular CLI

Я использую последний Angular CLI, и я создал папку пользовательских компонентов, которая представляет собой коллекцию всех компонентов.

Например, TextInputComponent имеет класс TextInputConfiguration, который помещается внутри src/components/configurations.ts, а в src/app/home/addnewuser/add.user.component.ts, где я его использую, есть:

import {TextInputConfiguration} from "../../../components/configurations";

Это прекрасно, но по мере того, как мое приложение становится все больше и глубже, ../ увеличивается, как я могу справиться с этим?

Ранее для SystemJS я бы установил путь через system.config.js, как показано ниже:

System.config({
..
 map : {'ng_custom_widgets':'components' },
 packages : {'ng_custom_widgets':{main:'configurations.ts', defaultExtension: 'ts'},
)};

Как сделать то же самое для webpack с помощью Angular CLI?

Ответы

Ответ 1

Per этот комментарий, вы можете добавить свой источник приложения через paths в tsconfig.json:

{
  "compilerOptions": {
    ...,  
    "baseUrl": ".",
    "paths": {
      ...,
      "@app/*": ["app/*"],
      "@components/*": ["components/*"]
    }
  }
}

Затем вы можете импортировать абсолютно из app/ или components/ вместо относительного к текущему файлу:

import {TextInputConfiguration} from "@components/configurations";

Примечание. baseUrl должен быть указан, если paths.

См. также

Ответ 2

Благодаря jonrsharpe answer, чтобы указать мне в правильном направлении. Хотя после добавления paths, как определено в ответе, я все еще не смог заставить его работать. Для всех, кто сталкивается с такой же проблемой, как и я в будущем, вот что я сделал, чтобы исправить проблемы.

У меня есть общий модуль, и его службы используются в нескольких компонентах, поэтому...

tsconfig.json:

{
    "compilerOptions": {
        ...
        "baseUrl": ".", //had to add this too
        "paths": {
            "@shared/*": ["src/app/modules/shared/*"]
        }
    }
}

После этого VS Code смог разрешить import, но я все еще получил следующую ошибку от webpack во время компиляции.

Модуль не найден: Ошибка: не удается разрешить

Чтобы исправить это, мне пришлось добавить

  • baseUrl of tsconfig в webpack resolve.modules
  • paths of tsconfig в webpack resolve.alias

webpack.config.js:

resolve: {
  extensions: ['*', '.js', '.ts'],
  modules: [
    rootDir,
    path.join(rootDir, 'node_modules')
  ],
  alias: {
    '@shared': 'src/app/modules/shared'
  }
},

component.ts:

import { FooService } from '@shared/services/foo.service'
import { BarService } from '@shared/services/bar.service'
import { BazService } from '@shared/services/baz.service'

Чтобы сделать его еще более чистым, я добавил папку с внутренними службами index.d.ts и экспортировал все мои сервисы оттуда, например:

index.d.ts:

export * from './foo.service';
export * from './bar.service';
export * from './baz.service';

и теперь внутри любого компонента :

import { FooService, BarService, BazService } from '@shared/services';

Ответ 3

Прежде всего, ответ правильный, но после того, как вы пытаетесь найти через интернет n, пытаясь понять, что конкретно проблема и попробовать другой вариант устранения неполадок, я познакомился с baseUrl и Path. работает более

Если вы используете baseUrl: "." , как показано ниже, он работает в VScode, но не при компиляции

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "baseUrl": ".",
    "paths": {
      "@myproject/*": ["src/app/*"]
    }    
}

В соответствии с моим пониманием и моим рабочим приложением и проверенным кодом angular aio, я предлагаю использовать baseUrl: "src" , как показано ниже

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "baseUrl": "src",
    "paths": {
      "@myproject/*": ["app/*"],
      "testing/*": ["testing/*"]
    }    
}

Имея базовый url в качестве источника (каталог src), компилятор правильно решает модули.

Надеюсь, это поможет людям решить эту проблему.