Angular 2에서 상대 경로가 매우 긴 가져 오기를 피하는 방법은 무엇입니까?


답변:


138

TypeScript 2.0 이상

TypeScript 2.0에서는 다음 위치에 baseUrl속성을 추가 할 수 있습니다 tsconfig.json.

{
    "compilerOptions": {
        "baseUrl": "."
        // etc...
    },
    // etc...
}

그런 다음 기본 디렉토리에있는 것처럼 모든 것을 가져올 수 있습니다.

import {XyService} from "services/validation/xy.service";

paths여기에 패턴을 일치시키고 매핑 할 수있는 속성을 추가 할 수 있습니다 . 예를 들면 :

{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "services/*": [
                "services/validation/*"
            ]
        }
        // etc...
    },
    // etc...
}

다음과 같이 어디에서나 가져올 수 있습니다.

import {XyService} from "services/xy.service";

거기에서 이러한 가져 오기 이름을 지원하기 위해 사용중인 모듈 로더를 구성해야합니다. 지금은 TypeScript 컴파일러가 자동으로 매핑하지 않는 것 같습니다.

이에 대한 자세한 내용은 github 문제를 참조하십시오 . rootDirs여러 프로젝트를 사용할 때 유용한 속성 도 있습니다.

Pre TypeScript 2.0 (TS 2.0+에서도 여전히 적용 가능)

"배럴" 을 사용하면 더 쉽게 만들 수 있다는 것을 알았습니다 .

  1. 각 폴더에서 index.ts파일을 만듭니다 .
  2. 이러한 파일에서 폴더 내의 각 파일을 다시 내 보냅니다.

귀하의 경우 먼저 my-app-name/services/validation/index.ts. 이 파일에 다음 코드가 있습니다.

export * from "./xy.service";

그런 다음라는 파일을 만들고 다음 my-app-name/services/index.ts코드를 갖습니다.

export * from "./validation";

이제 다음과 같이 서비스를 사용할 수 있습니다 ( index암시적임).

import {XyService} from "../../../services";

그리고 거기에 여러 개의 파일이 있으면 훨씬 쉬워집니다.

import {XyService, MyOtherService, MyOtherSerivce2} from "../../../services";

이러한 추가 파일을 유지해야하는 것은 선행 작업이 조금 더 많지만 ( barrel-maintainer를 사용하여 작업을 제거 할 수 있음 ) 결국에는 적은 작업으로 결과를 얻을 수 있습니다. 주요 디렉토리 구조 변경을 수행하는 것이 훨씬 쉽고 수행해야하는 가져 오기의 수를 줄입니다.

주의

이 작업을 할 때주의해야 할 사항과 할 수없는 사항이 몇 가지 있습니다.

  1. 순환 재수출을 주시해야합니다. 따라서 두 하위 폴더의 파일이 서로를 참조하는 경우 전체 경로를 사용해야합니다.
  2. 동일한 원본 폴더의 폴더로 돌아가서는 안됩니다 (예 : 유효성 검사 폴더의 파일에 있고 import {XyService} from "../validation";). 나는 이것을 발견했고 첫 번째 요점은 정의되지 않은 수입의 오류로 이어질 수 있습니다.
  3. 마지막으로 동일한 이름을 가진 하위 폴더에 두 개의 내보내기를 가질 수 없습니다. 일반적으로 그것은 문제가되지 않습니다.

2
@ ThomasZuberbühler TypeScript 1.8에서 사용할 수있을 것이라고 생각합니다 ( 여기 참조 ).
David Sherret

3
npm으로 Typescript 2.0 이상을 다운로드하려면 어떻게해야합니까?
maximedupre

4
작은 팁-문서를 읽은 후 baseUrl'tsconfig.json'의 위치에 상대적인 것으로 나타났습니다 . 따라서 우리의 경우 (각 응용 프로그램) 값은이어야합니다 "baseUrl": "./app",. 여기서 "app"은 응용 프로그램의 루트입니다.
Pawel Gorczynski

10
angular-cli 사용자 전용 : angular-cli 2+를 사용하는 경우 webpack 및 blackboxed webpack.config.js (node_modules 내부)로 전환했습니다. "여기에서 이러한 가져 오기 이름도 지원하기 위해 사용중인 모듈 로더를 구성해야합니다." webpack.config.js는 블랙 박스이기 때문에이 부분을 할 수 없습니다. 다행히, 나는 문제가 이미보고 된 발견 여기 에 의해 해결 PR. TL; DR blackboxed webpack 구성은 지금 tsconfig.json을 볼 수있을만큼 똑똑합니다.
케빈

1
angular-cli 사용자의 경우 "ng eject"로 webpack.config를 생성 할 수 있습니다. 프로젝트를 제공 할 수 있으려면 .angular-cli.json-> 프로젝트에서 ejected : true를 제거해야합니다.
Drusantia

14

tsconfig.json에서 아래 구성을 사용하는 것이 더 좋습니다.

{
  "compilerOptions": {
    "...": "reduced for brevity",

    "baseUrl": "src",
    "paths": {
      "@app/*": ["app/*"]
    }
  }
}

Angular 6 이전의 전통적인 방법 :

`import {XyService} from '../../../services/validation/xy.service';`

다음과 같이 리팩토링되어야합니다.

import {XyService} from '@app/services/validation/xy.service

짧고 달다!


이 변경은 프로덕션에서 작동하지 않습니다 @shivangGupta
익명

1

방금이 질문을 보았습니다. 나는 그것이 지금 돌아 왔다는 것을 알고 있지만 그것을 접하는 사람에게는 더 간단한 대답이 있습니다.

오랫동안하던 일이 작동을 멈 췄고 Angular 7에서 뭔가 변경되었는지 궁금했기 때문에 만났습니다. 아니요, 그것은 단지 내 코드였습니다.

그럼에도 불구하고 tsconfig.json긴 가져 오기 경로를 피하기 위해 한 줄만 변경해야했습니다 .

{
  "compilerOptions": {
  "...": "simplified for brevity",

   "baseUrl": "src"
  }
}

예:

// before:
import {XyService} from '../../../services/validation/xy.service';

// after:
import { XyService } from 'app/services/validation/xy.service';

이것은 Angular-CLI가 등장한 이후로 거의 나를 위해 일했습니다.


Chris의 노력에 감사하지만 답변에 사용 예제를 제공해야합니다!
George43g
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.