web-dev-qa-db-ja.com

tsconfig `paths`で定義されているモジュールが見つかりません

モックサーバーのエイリアスを設定しようとしています。 tsファイルをコンパイルしようとすると、tsconfig,json-> pathsで定義されているにもかかわらず、適切なモジュールが見つからないというエラーが返されます

フォルダー構造:

├── server
│   └── src
│       └──/json
├── src
│   └──/modules
├── tsconfig.json

こちらが私のtsconfig.jsonです

{
    "compilerOptions": {
        "baseUrl": "./src",
        "experimentalDecorators": true,
        "jsx": "react",
        "lib": [
            "dom",
            "es2015",
            "es2015.promise"
        ],
        "module": "commonjs",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "noUnusedLocals": true,
        "esModuleInterop": true,
        "paths": {
            "@project/app/modules/*": [
                "modules/*"
            ],
            "@project/server/data/*": [
                "../server/src/json/*"
            ]
        },
        "sourceMap": true,
        "target": "es5"
    },
    "exclude": [
        "node_modules",
        "tools"
    ]
}

エラー:Error: Cannot find module '@project/server/data/accounts/accountsList'

9

私は同じ問題に直面しました。私は多くのことを試しました、そして今私は私のために働く解決策を得ました。 angularプロジェクトにアプリとライブラリがあります。アプリでライブラリエイリアスを使用したいのですが。

私は次の構造を持っています:

├── projects
│   └── lib
│       └── src
│           └── lib
│               └── lib-service.ts
│           └── index.ts
│   └── app
│       └──tsconfig.app.json
├── tsconfig.json

ルートフォルダーのtsconfig.jsonファイルには、次のパスが定義されています。

"paths": {
  "my-lib": [
    "projects/lib/src/index.ts"
  ]
}

そこで、index.tsファイルにアクセスして、エクスポートしたいものを定義します。私の場合、index.tsファイルには次のエントリがあります。

export * from './lib/lib-service';

これで、エイリアスを使用して、アプリのコンポーネントのLibServiceにアクセスできます。

import {LibService} from 'my-lib';

このエントリをtsconfig.app.jsonファイルに追加した場合、この解決策は機能しないことに注意してください。 IDE(私の場合はWebStorm)がルートフォルダに近いtsconfig.jsonファイルでエイリアスを検索すると思います。 tsconfig.app.jsontsconfig.jsonを拡張します

"extends": "../../tsconfig",

多分あなたはあなたを再起動する必要がありますIDEインポート行の赤い下線を取り除くために。

この解決策がうまくいくことを願っています。 index.tsファイルでエクスポートするクラスを定義する必要があるため、もう少し設定作業が必要です。ただし、ライブラリを使用する場合は、他のアプリですべてを表示したくないので意味があります。

4
troYman

TLDR;

npm i -D module-alias

tsconfig.jsonパスから_moduleAliasesへのマッピングをpackage.jsonに追加します

"_moduleAliases": {
  "foo": "dist"
}

その理由は、"jsx": "react""module": "commonjs"と組み合わせて使用​​すると、baseUrlpathsが正しく構成されていても、絶対インポートを使用できなくなるためです。詳細な議論はこの issue にあります。

2
Mateja Petrovic

以下 tsconfig.jsonは私のために働き、import { foo } from '@models'など、関連するindex.tsバレルのエクスポート:

{
    "baseUrl": "./",
    "paths": {
      "@environment": ["./src/environments/environment.ts"],
      "@models": ["./src/app/shared/models/index.ts"],
      "@services": ["./src/app/shared/services/index.ts"]
    },
}
1
Avolition

パスエイリアスは、タイプチェックを行うためにTypeScript言語サービスでのみ使用されます。 NodeJS require()モジュールはそのような機能を実装していませんでした。したがって、パスエイリアスが必要な場合はNodeJSで実行できます。そのコードをNodeJSランドに持ち込む必要があります。

同じ問題が発生しました。研究後、このライブラリを使用して問題を解決しました。 [email protected]

npm i -g tsmon

tsmonを使用してts-nodeを置き換える

tsmon server/index.ts
0
Ling