モジュール解決

リゾルバーとは、絶対パスでモジュールを特定するのに役立つライブラリです。モジュールは、別のモジュールからの依存関係として、次のように必要となる可能性があります。

import foo from 'path/to/module';
// or
require('path/to/module');

依存関係モジュールは、アプリケーションコードまたはサードパーティライブラリからのものである可能性があります。リゾルバーは、webpackが、そのようなすべてのrequire/importステートメントのバンドルに含める必要があるモジュールコードを見つけるのに役立ちます。webpackは、モジュールをバンドルする際に、ファイルパスを解決するためにenhanced-resolveを使用します。

webpackでの解決ルール

enhanced-resolveを使用して、webpackは3種類のファイルパスを解決できます

絶対パス

import '/home/me/file';

import 'C:\\Users\\me\\file';

ファイルへの絶対パスがすでにわかっているため、それ以上の解決は必要ありません。

相対パス

import '../src/file1';
import './file2';

この場合、importまたはrequireが発生するソースファイルのディレクトリがコンテキストディレクトリと見なされます。import/requireで指定された相対パスは、このコンテキストパスに結合されて、モジュールの絶対パスが生成されます。

モジュールパス

import 'module';
import 'module/lib/file';

モジュールは、resolve.modulesで指定されたすべてのディレクトリ内で検索されます。 resolve.alias設定オプションを使用してエイリアスを作成することにより、元のモジュールパスを別のパスに置き換えることができます。

  • パッケージにpackage.jsonファイルが含まれている場合、resolve.exportsFields設定オプションで指定されたフィールドが順番に検索され、package.jsonの最初のそのようなフィールドが、パッケージエクスポートガイドラインに従って、パッケージから利用可能なエクスポートを決定します。

上記のルールに基づいてパスが解決されると、リゾルバーはパスがファイルまたはディレクトリを指しているかどうかを確認します。パスがファイルを指している場合

  • パスにファイル拡張子がある場合、ファイルはすぐにバンドルされます。
  • それ以外の場合、ファイル拡張子は、リゾルバーが解決に受け入れられる拡張子(例:.js.jsx)を伝えるresolve.extensionsオプションを使用して解決されます。

パスがフォルダーを指している場合は、適切な拡張子を持つ適切なファイルを見つけるために、次の手順が実行されます

  • フォルダーにpackage.jsonファイルが含まれている場合、resolve.mainFields設定オプションで指定されたフィールドが順番に検索され、package.jsonの最初のそのようなフィールドがファイルパスを決定します。
  • package.jsonがない場合、またはresolve.mainFieldsが有効なパスを返さない場合、インポート/必須ディレクトリに一致するファイル名が存在するかどうかを確認するために、resolve.mainFiles設定オプションで指定されたファイル名が順番に検索されます。
  • ファイル拡張子は、resolve.extensionsオプションを使用して同様の方法で解決されます。

webpackは、ビルドターゲットに応じて、これらのオプションに適切なデフォルトを提供します。

ローダーの解決

これは、ファイル解決に指定されたものと同じルールに従います。ただし、resolveLoader設定オプションを使用すると、ローダーに個別の解決ルールを設定できます。

キャッシング

すべてのファイルシステムアクセスはキャッシュされるため、同じファイルへの複数の並列またはシリアルリクエストがより高速に実行されます。監視モードでは、変更されたファイルのみがキャッシュから削除されます。監視モードがオフの場合、コンパイルごとにキャッシュがパージされます。

上記の構成オプションの詳細については、Resolve APIを参照してください。

5 貢献者

pksjcepastelskybyzykEugeneHlushkowizardofhogwarts