Разрешение модулей
Резолвер — это библиотека, которая помогает в поиске модуля по его абсолютному пути. Модуль может быть потребован как зависимость от другого модуля, как:
import foo from 'path/to/module';
// or
require('path/to/module'); Зависимый модуль может быть из кода приложения или сторонней библиотеки. Резолвер помогает webpack найти код модуля, который нужно включить в бандл для каждой такой require/import инструкции. webpack использует enhanced-resolve для разрешения путей к файлам при сборке модулей.
Правила разрешения в webpack
Используя enhanced-resolve, webpack может разрешать три типа путей к файлам:
Абсолютные пути
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определяет доступные экспорты из пакета в соответствии с руководством по экспорту пакетов.
После того, как путь разрешен в соответствии с вышеуказанным правилом, резолвер проверяет, указывает ли путь на файл или директорию. Если путь указывает на файл:
- Если путь имеет расширение файла, то файл сразу включается в бандл.
- В противном случае, расширение файла разрешается с помощью опции
resolve.extensions, которая сообщает резолверу, какие расширения приемлемы для разрешения, например.js,.jsx.
Если путь указывает на папку, то выполняются следующие шаги для поиска нужного файла с нужным расширением:
- Если папка содержит файл
package.json, то поля, указанные вresolve.mainFieldsопции конфигурации, просматриваются в порядке следования, и первое из таких полей вpackage.jsonопределяет путь к файлу. - Если нет файла
package.jsonили еслиresolve.mainFieldsне возвращают допустимый путь, имена файлов, указанные вresolve.mainFilesопции конфигурации, ищутся последовательно, чтобы проверить, существует ли соответствующее имя файла в импортированной/требуемой директории. - Затем расширение файла разрешается аналогичным образом с помощью опции
resolve.extensions.
Webpack предоставляет разумные значения по умолчанию для этих опций в зависимости от вашей цели сборки.
Разрешение загрузчиков
Это соответствует тем же правилам, что и указанные для разрешения файлов. Но опцию конфигурации resolveLoader можно использовать для настройки отдельных правил разрешения для загрузчиков.
Кэширование
Каждый доступ к файловой системе кэшируется, чтобы несколько параллельных или последовательных запросов к одному и тому же файлу выполнялись быстрее. В режиме отслеживания из кэша удаляются только изменённые файлы. Если режим отслеживания отключён, кэш очищается перед каждой компиляцией.
См. API разрешения, чтобы узнать больше об указанных выше опциях конфигурации.
© JS Foundation and other contributors
Licensed under the Creative Commons Attribution License 4.0.
https://webpack.js.org/concepts/module-resolution