Почему веб-пакет требует пустого расширения

Я пытаюсь понять, почему webpack требует этого пустого расширения.

Внутри resolve.extensions всегда такая конфигурация:

extensions: ['', '.js', '.jsx']

Почему это не может быть так:

extensions: ['.js', '.jsx']

Ответ 1

В документации :

Настройка этой опции отменяет значение по умолчанию, а это означает, что веб-пакет больше не будет пытаться разрешать модули с использованием расширений по умолчанию. Если вы хотите, чтобы модули, требуемые с расширением (например, require('./somefile.ext')), были правильно разрешены, вы должны включать пустую строку в свой массив. Аналогично, если вы хотите, чтобы модули, которые требовались без расширений (например, require('underscore')), были разрешены к файлам с расширениями .js, вы должны включать ".js" в свой массив.

Другими словами, если вы не указали пустую строку и не нуждались в модуле в качестве ./foo.js, вместо этого webpack будет искать ./foo.js.js и ./foo.js.jsx.

Ответ 2

В новой версии Webpack вы не можете использовать пустую строку. В нем говорится:

Getting error: configuration.resolve.extensions[0] should not be empty.

Вы должны использовать extensions: ['.js', '.jsx'] или extensions: ['*', '.js', '.jsx'].

Проблема: https://github.com/webpack/webpack/issues/3043

Ответ 3

Расширение '' действительно обязательно, если вы требуете файл по его имени:

Если вы хотите, чтобы модули, необходимые для их расширения (например, require('./somefile.ext')), были правильно разрешены, вы должны включать пустую строку в свой массив.

Webpack всегда будет использовать один из extensions при попытке найти файл по строкам:

var fileName = nameGiven + extension[i];
fs.exists(fileName, ...);

Если nameGiven содержит полное имя файла, например require('./foo.js'), он все равно добавит каждое расширение:

'./foo.js' + '.js'  // './foo.js.js'  duplicated extension
'./foo.js' + '.jsx' // './foo.js.jsx' mixed extensions

По сравнению с:

'./foo.js' + ''     // './foo.js'     left as-is

Ответ 4

Теперь это было изменено в webpack2.

Теперь вам нужно предоставить только:

resolve: {extensions: ['.js', '.es6']}

И если вы предоставите '' в массиве, он выдает ошибку:

configuration.resolve.extensions [0] не должно быть пустым