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 issueで読むことができます。rootDirs複数のプロジェクトを使用するときに役立つプロパティもあります。

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つのサブフォルダにあるファイルが相互に参照している場合は、完全パスを使用する必要があります。
  2. 同じ元のフォルダーからフォルダーを戻すことはできません(たとえば、検証フォルダー内のファイルにあり、を実行していますimport {XyService} from "../validation";)。私はこれを見つけました、そして最初のポイントは定義されていないインポートのエラーにつながる可能性があります。
  3. 最後に、同じ名前の2つのエクスポートをサブフォルダーに含めることはできません。通常、それは問題ではありません。

2
@ThomasZuberbühlerTypeScript 1.8で利用可能になると思います(ここを参照)。
David Sherret、2016年

3
Typescript 2.0+をnpmでダウンロードするにはどうすればよいですか?
maximedupre 2016年

4
小さなヒント-ドキュメントを読んだ後、それbaseUrlは 'tsconfig.json'の場所に関連していることがわかりました。したがって、私たちの場合(角度のあるアプリケーション)の値はである必要が"baseUrl": "./app",あり、「app」はアプリケーションのルートです。
Pawel Gorczynski、2016年

10
angular-cliユーザーのみ:angular-cli 2+を使用している場合、webpackとブラックボックス化されたwebpack.config.js(node_modules内)に切り替えました。 「そこから、これらのインポート名をサポートするために、使用しているモジュールローダーも構成する必要があります。」 webpack.config.jsはブラックボックス化されているため、この部分を行うことはできません。幸いにも、問題はすでにここで報告され、この PR によって解決されていることがわかりました。TL; DRブラックボックス化されたwebpack構成は、tsconfig.jsonを見るのに十分スマートです。
Kevin

1
angular-cliユーザーの場合、「ng reject」を使用してwebpack.configを生成できます。プロジェクトにサービスを提供できるようにするには、.angular-cli.json->プロジェクトから排出された:trueを削除する必要があることに注意してください。
ドルサンチア2017

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、長いインポートパスを回避するために1行変更するだけで済みました。

{
  "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が登場して以来、かなりうまくいきました。


クリスの努力に感謝しますが、あなたの答えに使用例を提供するべきでした!
George43g
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.