私はtsconfig.json
で path-mapping について読んでいましたが、次のような見苦しいパスを使わないようにしたいと思いました。
プロジェクトとライブラリを含むモノリポジトリがあるので、プロジェクトの組織は少し変わっています。プロジェクトは会社別とブラウザ/サーバー/ユニバーサル別にグループ化されています。
次の代わりにtsconfig.json
でパスを設定するにはどうすればよいですか。
import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
私は使えます:
import { Something } from "lib/src/[browser/server/universal]/...";
Webpackの設定で何か他に必要なものはありますか?それともtsconfig.json
で十分ですか?
TS機能であるため、これはtsconfig.jsonファイルで設定できます。
あなたはこのようにすることができます:
"compilerOptions": {
"baseUrl": "src", // This must be specified if "paths" is.
...
"paths": {
"@app/*": ["app/*"],
"@config/*": ["app/_config/*"],
"@environment/*": ["environments/*"],
"@shared/*": ["app/_shared/*"],
"@helpers/*": ["helpers/*"]
},
...
あなたが参照したいパスは、それがあなたが指しているルートのベースとしてあなたのbaseUrlを取ることを心に留めておいてください、そしてそれはdocに記述されているように必須です。
文字 '@'は必須ではありません。
そのように設定した後は、次のように簡単に使用できます。
import { Yo } from '@config/index';
あなたが気付くかもしれない唯一のことはインテリセンスが現在の最新バージョンでは動作しないということです、それで私はファイルをインポート/エクスポートするためのインデックス規約に従うことをお勧めします。
https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping
UPDATE1つのファイルにマッピングする方法を紹介するために作成したこの例を調べてください。
https://github.com/ialex90/TypeScript-Node-Starter/commit/a4e8cc1f8f8d5176e0099e05b51f97b0ef4bebea
baseUrl
とpaths
のドキュメント を組み合わせて使用できます。
Rootが一番上のsrc
ディレクトリにあると仮定します(そして私はあなたのイメージを正しく読みます)
// tsconfig.json
{
"compilerOptions": {
...
"rootDir": ".",
"paths": {
"lib/*": [
"src/org/global/lib/*"
]
}
}
}
webpack
の場合、 モジュールの解像度 を追加する必要があるかもしれません。 webpack2
の場合、これは次のようになります。
// webpack.config.js
module.exports = {
resolve: {
...
modules: [
...
'./src/org/global'
]
}
}
アスタリスクでこの同様の解決策をチェックしてください
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
},
Alejandros答えは私のために働きました、しかし私がawesome-TypeScript-loader
をwebpack 4と共に使っているので、私はまた私のwebpack.configファイルに tsconfig-paths-webpack-plugin
を加えなければなりませんでした正しく解決するために
パスを使用している場合は、tsc
を使用してTypeScriptをプレーンJavaScriptにコンパイルした後に、絶対パスを相対パスに戻す必要があります。
これに対する最も一般的な解決策は、これまで tsconfig-paths でした。
試してみましたが、複雑な設定ではうまくいきませんでした。また、実行時にパスを解決します。つまり、パッケージサイズの点でオーバーヘッドが発生し、パフォーマンスが解決されます。
そこで、私は自分で解決策を書いた、 tscpaths 。
私はそれがコンパイル時にパスを置き換えるので全体的により良いと言うでしょう。実行時の依存関係やパフォーマンスのオーバーヘッドがないことを意味します。使い方はとても簡単です。ビルドスクリプトにpackage.json
という行を追加するだけです。
プロジェクトはかなり若いので、設定が非常に複雑な場合はいくつかの問題が発生する可能性があります。私の設定はかなり複雑ですが、私の設定では問題なく動作します。
typeScript + webpack 2 + at-loaderが使用されている場合、追加のステップがあります(@ mlekoの解決策は部分的にしか機能しませんでした)。
// tsconfig.json
{
"compilerOptions": {
...
"rootDir": ".",
"paths": {
"lib/*": [
"src/org/global/lib/*"
]
}
}
}
// webpack.config.js
const { TsConfigPathsPlugin } = require('awesome-TypeScript-loader');
resolve: {
plugins: [
new TsConfigPathsPlugin(/* { tsconfig, compiler } */)
]
}
/
はルートからのみ始まり、相対パスを取得するために./
または../
を使用する必要があります
これは私のために働く:
yarn add --dev tsconfig-paths
ts-node -r tsconfig-paths/register <your-index-file>.ts
これにより、tsconfig.json内のすべてのパスがロードされます。 tsconfig.jsonのサンプル:
{
"compilerOptions": {
{…}
"baseUrl": "./src",
"paths": {
"assets/*": [ "assets/*" ],
"styles/*": [ "styles/*" ]
}
},
}
これが機能するためのbaseUrlとパスの両方があることを確認してください。
そしてインポートすることができます:
import {AlarmIcon} from 'assets/icons'
以下のコードの代わりにその種類の相対パス
import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
「../../../../../」という奇妙に見えることも避けられません。
だからTypeScriptの設定ファイルは同じ答えを持っています。 baseUrlを指定するだけで、configが相対パスを処理します。
設定方法:tsconfig.jsonファイルに以下のプロパティを追加します。
"baseUrl": "src",
"paths": {
"@app/*": [ "app/*" ],
"@env/*": [ "environments/*" ]
}
だから最後にそれは以下のようになります
import { Something } from "@app/src/[browser/server/universal]/...";
その外観はシンプルで、素晴らしく、そしてもっと読みやすくなっています。
"paths"
anylongerにtsconfig.json
を設定することを許可しないReactの更新があったようです。
Nicely Reactは単に警告を出力します。
The following changes are being made to your tsconfig.json file:
- compilerOptions.paths must not be set (aliased imports are not supported)
それからtsconfig.json
を更新し、"paths"
セクション全体を削除します。このランを回避する方法があります
npm run eject
これにより、config
およびscripts
ディレクトリとbuild/configファイルがプロジェクトに追加され、すべてのcreate-react-scripts
設定が削除されます。これはまた、{project}/config/*
ファイルを更新することによって、すべてがどのように構築されているかなど、より多くの制御を可能にします。
tsconfig.json
を更新してください
{
"compilerOptions": {
"baseUrl": "./src",
{…}
"paths": {
"assets/*": [ "assets/*" ],
"styles/*": [ "styles/*" ]
}
},
}