404s на некоторых изображениях из загрузчика URL-адресов Webpack

Есть много вопросов по этому поводу и много ответов, читайте ниже, чтобы увидеть, что я пробовал и почему они не работали. Я предполагаю, что моя проблема связана с фундаментальным непониманием того, как работает url-loader.

У меня есть изображения, включенные в мои файлы .less. Я использую два разных формата в качестве примера того, что я пробовал.

без приложения

#logo {
  background-image: url("~/img/LoginMarketingImage.png");
}
#logotwo{
  background-image: url("../public/img/LoginMarketingImage2.png");
}

webpack.config.js

module.exports = {
    context: path.resolve(__dirname, '../../'),
    entry: {
        app: './public/js/app.js'
    },
    output: {
        path: path.resolve(__dirname, '../build'),
        filename: '[name].js',
        publicPath: '/'
    },

я тоже пробовал

webpack.config.js

module.exports = {
    context: path.resolve(__dirname, '../../'),
    entry: {
        app: './public/js/app.js'
    },
    output: {
        path: path.resolve(__dirname, '../build'),
        filename: '[name].js',
        publicPath: ''
    },

Как и ниже, на основе: webpack css-loader не находит изображения в ссылке url() во внешней таблице стилей

webpack.config.js

module.exports = {
    context: path.resolve(__dirname, '../../'),
    entry: {
        app: './public/js/app.js'
    },
    output: {
        path: path.resolve(__dirname, '../build'),
        filename: '[name].js',
        publicPath: 'https://localhost:9081/'
    },

Моя конфигурация модуля выглядит так

webpack.config.js

   module: {
        rules: [
        {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: 'url-loader',
            options: {
                limit: 2000000,
                name: utils.assetsPath('img/[name].[ext]')
            }
        },
     ]
   }

Я экспериментировал с пределом 1 и выше, чтобы увидеть, работает ли встроенный или не встроенный.

Моя структура папок выглядит следующим образом

  build/
  less/
     app.less
  public/
     img/
        LoginMarketingImage.png
        LoginMarketingImage2.png

  config/
     webpack/
        webpack.config.js

Мои результаты

Если я установлю ограничение на 1 и заставлю все изображения выводиться напрямую, единственный раз, когда они выводятся, - это если они используют синтаксис url("../"). url("~/") не выдает ошибок веб-пакета, но изображения не выводятся в папку сборки. В этом случае изображения, использующие синтаксис url("../"), также не вызывают ошибок в браузере. Однако это не идеально, так как я хочу воспользоваться возможностью url-loader возвращать DataURL. В этом случае изображения, использующие синтаксис url("~/"), выдают ошибку GET https://localhost:9081/img/logo.png 404 (Not Found) независимо от настройки publicPath.

Если я установлю ограничение на 20000000, очевидно, что никакие изображения не будут помещены в папку сборки file-loader. Однако все изображения возвращают в браузере ошибку 404, независимо от настройки publicPath.

Я чувствую, что неправильно понимаю, как использовать url-loader. Какая конфигурация мне нужна и как я должен требовать свои файлы внутри less, чтобы воспользоваться способностью url-loader возвращать DataURL?

РЕДАКТИРОВАТЬ: Основываясь на этой проблеме, я убедился что исходные карты css отключены.


person Caleb Jay    schedule 20.04.2018    source источник
comment
Было бы полезно, если бы вы могли включить репозиторий с полным неудачным тестовым примером - например, загрузчики css и less здесь не включены.   -  person Steven Dickinson    schedule 24.04.2018


Ответы (1)


Я не могу точно определить проблему здесь, но похоже, что проблема в конфигурации publicPath. Я собрал примерную суть с минимумом, необходимым для правильной работы загрузчика URL.

Некоторые вещи, которые следует отметить:

  • Убедитесь, что опция test указана правильно.
  • Вы не упомянули, какую версию веб-пакета вы используете, но я предполагаю, что она> 2. Если это == 2, вам следует обновиться, потому что в более новых версиях исправлено множество ошибок, а API конфигурации почти на 100% совместим.
  • Не используйте путь импорта с тильдой, это ярлык для project-root-dir/node_modules (по крайней мере, в webpack 1.x)
  • Я предполагаю, что вы используете webpack-dev-server. Если нет, то вам не нужно устанавливать publicPath и тому подобное
  • Не меняйте параметр name url-loader, если у вас все работает без него. Изменение его пути может запутать веб-пакет
person Guilherme Nagatomo    schedule 24.04.2018