2016-07-26 2 views
29

現在、TypeScriptで記述された複数のノードモジュールで構成され、node_modulesディレクトリにインストールされているTypeScriptアプリケーションを作成しています。TypeScriptインポートパスエイリアス

続行する前に、私はTypeScript 2.0を使用していることに注意したいと思います。必要がある場合は、2.1 devリリースを使用することに反対しません。私はちょうどこれを働かせたいと思う。

dist/ 
    es2015/ 
     index.js 
     utils/ 
      Calculator.js 
      Calculator.d.ts 
      Date.js 
      Date.d.ts 
      Flatpack.js 
      Flatpack.d.ts 
src/ 
    index.ts 
    utils/ 
     Calculator.ts 
     Date.ts 
     Flatpack.ts 

DISTフォルダがこのパスは私のtsconfig.jsonファイルの内部outDirを用いて構成されていると、生成されたソースである:

各ノードモジュールの構造は、線に沿って何かです。私はpackage.jsonmainプロパティをdist/es2015/index.jsに設定しました。注意すべき

重要なもの:私のプロジェクトで

  • 私は活字体2.0
  • を使用していますnode
  • moduleResolutionタイプを使用しています私は内からファイルをインポートする方法を求めていないのですパッケージ。パッケージをNpm経由でインストールしてから、このモジュールを使用しているアプリケーション内からpackagename/経由でインポートしています。

ここで私の質問/問題が来ます。

import {Sin, Cos, Tan} from "common-utils/utils/Calculator"; 

ただし、ファイルがdist/es2015/utilsディレクトリに解決することはできません。このモジュールからファイルをインポートする一方で、私はこれを行うことができるようにしたいと思います。理想的には私の輸入品はこの具体的なdistのフォルダから解決することが望ましく、起きているように見えるのはルートからではありません。

上記の輸入はそれを動作させるために、以下のように記述する必要がありますしかし

import {Sin, Cos, Tan} from "common-utils/dist/es2015/utils/Calculator"; 

、それぞれの時間は理想的ではありません、それは単に輸入のいくつかは本当に長い見えるのですdist/es2015を書きます。 dist/es2015ディレクトリに解決するためのモジュールを構成する方法はありますか?私は自分のプロジェクトの中で上書きする必要はありません。理想的には、各モジュールはファイルがどこから解決されるかを指定します。

Jspmで使用するプラグイン/モジュールを作成するときに、Jspmで何を聞いているのかまだわからない場合は(と謝ります)、package.jsonの内部を次のようになります。

上記のTypeScript(該当する場合)に相当するものを探しています。つまり、エンドユーザーがnpm install my-cool-packageを実行して、アプリケーションで何かをインポートしようとすると、すべてのインポートはデフォルトでcommonjsディレクトリに解決されます(上記の例ではamdですが、同じ前提です)。

これが可能か、ここで何か誤解していますか?私はいくつかの新しいパスマッピング機能が最新のリリースに追加されたことを知っていますが、それらの使用に関するドキュメントはほとんど存在しません。

+2

あなたは 'からの輸入{罪、COS、タン}を試すことができますindex.ts''で 'Calculator.ts'をインポートする場合"./utils/Calculator" –

+1

これは、パッケージ自体からインポートする場合は間違いなく機能します。しかし、私の問題は、これが 'node_modules'にインストールしてから' packagename 'からインポートするモジュールだということです。 - distフォルダへの直接パスを追加するのが面倒だと問題は、別名にしたいこれをデフォルトのインポート場所にしますが、モジュール内で行います。モジュールを使用するプロジェクトで設定する必要はありません。 –

+0

パッケージ名やファイル名を追加してパスをビルドできるconfigオブジェクトを追加すると、このタスクのsystem.jsやwebpackも見えます –

答えて

57

あなたのコメントを読んだ後、私はあなたの質問を誤解したことに気付きました!インポートされたパッケージの観点からパスを制御したい場合は、package.jsonmainプロパティを、モジュールのオブジェクトグラフを適切に表すファイルに設定するだけです。

{ 
    "main": "common-utils/dist/es2015/index.js" 
} 

あなたが探しているものを、プロジェクトの視点からのインポートパスを制御しようとしている場合は、モジュールの解決のための活字体2の新しいパスマッピング機能です。あなたは次のようにあなたのtsconfig.jsonを設定することにより、パスマッピングを有効にすることができます。

{ 
    "compilerOptions": { 
    "baseUrl": ".", 
    "paths": { 
     "angular2/*": ["../path/to/angular2/*"], 
     "local/*": ["../path/to/local/modules/*"] 
    } 
    } 
} 

次に、あなたの活字体のファイルで、あなたはこのようなモジュールをインポートすることができますでのパスマッピング機能の詳細については

import { bootstrap } from 'angular2/bootstrap'; 
import { module } from 'local/module'; 

をTypeScript 2 this Github issueを参照してください。あなたのケースでは

、私は次のような構成が動作するはずだと思う:

{ 
    "compilerOptions": { 
    "baseUrl": ".", 
    "paths": { 
     "common-utils/utils/*": ["./node_modules/common-utils/dist/es2015/utils/*"] 
    } 
    } 
} 
+0

ありがとう@faraz。私は今朝いつか試してみる。パス設定は私のモジュールに入りますが、プロジェクトではありません。そして、私のモジュールをプルするときにTypeScriptコンパイラは、このファイル内で定義されたパスをピックアップする必要がありますか? –

+0

いいえ、パス設定はTypeScriptプロジェクトにあり、プロジェクトから参照するモジュールを指しているはずです。 – fny

+0

私はそれがプロジェクト内で同様に動作するように思った。これは、モジュールの観点からTypeScript自体では現在できないことを私が求めていることを意味していますか?私は上記のことをしたいと思っていますが、パッケージ自体で定義してください。インポートすると、パスのエイリアスが取得されます。 Jspmはパッケージがパスのエイリアスを設定できるようにするために、TypeScriptがユーザーにこれらのパスエイリアスを追加するように指示するのはちょっと面倒です。 1つのパスグロブ文字列内で複数のワイルドカードがサポートされていますか? –