resolver 는 절대경로로 모듈을 찾아주는 라이브러리이다.
모듈은 다른 모듈의 의존성으로 필요한 경우가 있다.
```js
import foo from 'path/to/module';
require('path/to/module');
```
의존성 모듈은 애플리케이션 코드일 수도, 써드파티 라이브러리일 수도 있다.
resolver는 webpack으로 하여금 모든 import/require문마다 번들에 포함되어야할 모듈코드를 찾는데 도움을 준다.
webpack 은 [enhanced-resolve](https://github.com/webpack/enhanced-resolve)를 사용한다.
resolving rules
enhanced-resolve 를 사용하면, webpack은 3가지 종류의 파일 경로를 해석할 수 있다.
절대경로
import '/home/me/file';
import 'C:\\Users\\me\\file';
이미 절대경로로 작성한 경우 추가적인 해석이 필요하지 않다.
상대경로
import '../src/file1';
import './file2';
이 경우에, import 문이나 require문을 사용한 소스파일을 컨텍스트 디렉토리를 간주한다.
상대경로는 이 컨텍스트 경로와 결합되어 절대경로를 생성한다.
모듈 경로
import 'module';
import 'module/lib/file';
모듈은 resolve.modules 안에 명시된 모든 디렉토리 내부에서 검색된다.
resolve.alias 옵션을 사용하여 alias를 생성하면 원래 모듈 경로를 대체경로로 바꿀 수 있다.
- package.json이 있다면, resolve.exportsFields 에 명시된 필드들이 순차적으로 검색되고, package exports 가이드라인 에따라 export가능한 모듈을 결정한다.
경로가 해석되면, resolver 는 해당 경로가 파일인지 디렉토리인지 확인한다.
파일인 경우,
- 파일 확장자를 가진다면 해당 파일은 바로 번들링된다.
- 그렇지 않다면, 파일 확장자는 resolve.extensions 옵션에 따라 결정된다. 해당 옵션은 resolver에게 어떤 확장자가 해석가능한지를 알려준다.
폴더를 가리킨다면,
다음과 같은 절차가 실행되어 올바른 확장자를 가진 올바른 파일을 찾는다.
- 해당 폴더가 package.json을 가진다면, resolve.mainFields 설정옵션에 명시된 필드들이 순차적으로 조회된다. 그리고 package.json 에서 검색된 첫번째 필드가 파일의 경로를 결정한다.
- package.json이 없거나 resolve.mainFields가 적절한 경로를 리턴하지 않는다면, resolve.mainFiles 에 명시된 파일이름이 순차적으로 조회되고, 디렉토리에 매치되는 파일이름이 있는지 확인한다.
- 파일 확장자는 resolve.extensions 옵션이 해석되는 방식과 비슷하게 결정된다.
webpack은 빌드 타겟에 맞는 기본 옵션을 제공한다.
캐싱
모든 파일시스템 접근은 캐싱된다. 그래서 같은파일에 대한 병렬적이고 연속적인 요청이 빠르게 동작한다.
watch mode 에서, 변경된 파일은 자동으로 캐시에서 제거된다. watch mode 가 비활성화 된경우, 캐시는 매 컴파일 전에 해제된다.