Не удалось загрузить фоновое изображение с помощью sass-loader (Webpack)

У меня возникли проблемы с попыткой заставить браузер успешно найти фоновое изображение при использовании webpack и sass-loader/style-loader/css-loader.

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

Пока у меня...

Компонент

import React from 'react'

const Image = () => (
   <div className='sprite-container sprite-1'>
   </div>
)

export default Image

CSS

.sprite-container {
   width: 100px;
   height: 100px;
   border-radius: 100%;
   border: 1px solid blue; // I put this just to confirm the container div is there, which it is.
   background-image: url('/img/spritesheet.png');
   background-repeat: no-repeat;
   position: absolute;
   top: 250px;
   right: 20px;
}

.sprite-1 {
   background-position: -100px, -100px;
}

Как бы то ни было, div прозрачен. Контейнер есть, но фоновое изображение не загружается. Я новичок в компиляции SASS в Webpack, так что, возможно, это как-то связано с моей файловой структурой.

Это соответствующая часть моего файлового дерева:

- src
   - static (all static assets are served from this folder)
      - img
         -- spritesheet.png
   - styles
         -- app.scss
   -- app-client.js (importing app.scss here)

Я импортирую app.scss в свой основной файл js, app-client.js (который React монтирует в приложение).

Должен ли путь, указанный в свойстве background-image css, относиться к корневому каталогу или таблице стилей? Я предполагаю корневой каталог (/static).

Любая помощь приветствуется.


ОБНОВИТЬ

Дерево файлов

- src
   - static (all static assets are served from this folder)
      - img
         -- spritesheet.png
      - js
         -- bundle.js
   - styles
         -- app.scss
   -- app-client.js (importing app.scss here)

webpack.config.js

const debug = process.env.NODE_ENV !== "production";

const webpack = require('webpack');
const path = require('path');

// const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  devtool: debug ? 'inline-sourcemap' : null,
  entry: path.join(__dirname, 'src', 'app-client.js'),
  devServer: {
    inline: true,
    port: 3333,
    contentBase: "src/static/",
    historyApiFallback: {
      index: '/index-static.html'
    }
  },
  output: {
    path: path.join(__dirname, 'src', 'static', 'js'),
    publicPath: "/js/",
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {
         test: path.join(__dirname, 'src'),
         loader: ['babel-loader'],
         query: {
            cacheDirectory: 'babel_cache',
            presets: debug ? ['react', 'es2015', 'react-hmre'] : ['react', 'es2015']
         }
      },
      {
         test: /\.scss$/,
         loaders: [ 'style', 'css?sourceMap', 'sass?sourceMap' ]
         // loader: ExtractTextPlugin.extract(
         //     'style', // The backup style loader
         //     'css?sourceMap!sass?sourceMap'
         // )
      },
      {
         test: /\.png$/,
         loader: "url-loader?limit=10000&minetype=image/jpg"
      }
    ]
  },
  plugins: debug ? [] : [
   //  new ExtractTextPlugin('styles.css'),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
    }),
    new webpack.optimize.DedupePlugin(),
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.optimize.UglifyJsPlugin({
      compress: { warnings: false },
      mangle: true,
      sourcemap: false,
      beautify: false,
      dead_code: true
    }),
  ]
};

package.json

{
  "name": "***",
  "version": "1.0.0",
  "description": "***",
  "main": "src/server.js",
  "repository": "**REPO**",
  "scripts": {
    "start": "NODE_ENV=production node_modules/.bin/babel-node --presets 'react,es2015' src/server.js",
    "start-dev": "npm run start-dev-hmr",
    "start-dev-single-page": "node_modules/.bin/http-server src/static",
    "start-dev-hmr": "node_modules/.bin/webpack-dev-server --progress --inline --hot",
    "build": "NODE_ENV=production node_modules/.bin/webpack -p"
  },
  "author": "***",
  "license": "UNLICENSED",
  "dependencies": {
    "axios": "^0.15.3",
    "babel-cli": "^6.11.4",
    "babel-core": "^6.13.2",
    "babel-loader": "^6.2.5",
    "babel-plugin-react-html-attrs": "^2.0.0",
    "babel-plugin-transform-decorators-legacy": "^1.3.4",
    "babel-plugin-transform-object-rest-spread": "^6.22.0",
    "babel-preset-es2015": "^6.13.2",
    "babel-preset-react": "^6.11.1",
    "babel-preset-react-hmre": "^1.1.1",
    "babel-preset-stage-2": "^6.22.0",
    "ejs": "^2.5.1",
    "express": "^4.14.0",
    "react": "^15.3.1",
    "react-dom": "^15.3.1",
    "react-redux": "^5.0.2",
    "react-router": "^2.6.1",
    "redux": "^3.6.0",
    "redux-logger": "^2.7.4",
    "redux-thunk": "^2.2.0"
  },
  "devDependencies": {
    "css-loader": "^0.26.1",
    "file-loader": "^0.9.0",
    "http-server": "^0.9.0",
    "node-sass": "^4.3.0",
    "react-hot-loader": "^1.3.0",
    "sass-loader": "^4.1.1",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "webpack": "^1.13.2",
    "webpack-dev-server": "^1.14.1"
  }
}

person Paulos3000    schedule 21.01.2017    source источник
comment
Поскольку URL-адрес вашего изображения начинается с косой черты, он является абсолютным, поэтому вам нужно указать его как '/static/img/spritesheet.png'.   -  person Tudor Ilisoi    schedule 21.01.2017
comment
@TudorIlisoi - пробовал... все равно без радости :(   -  person Paulos3000    schedule 21.01.2017
comment
вы также пробовали '../img/spritesheet.png' ?   -  person Tudor Ilisoi    schedule 21.01.2017
comment
Да, это просто приводит к сбою процесса компиляции, поскольку путь к файлу не существует. Добавление ../ удаляет /static из пути к файлу   -  person Paulos3000    schedule 21.01.2017
comment
ну, может быть, этот ответ проливает свет? Также обсуждается загрузка изображений stackoverflow.com/questions /33969872/   -  person Tudor Ilisoi    schedule 21.01.2017
comment
@Paulos3000: Поскольку вы используете Абсолютный путь, ваше изображение должно присутствовать в папке Dist/Output [откуда вы обслуживаете index.html, reactbundle.js, css] в соответствующей структуре '/img/spritesheet.png '. Было бы лучше, если бы вы могли поделиться своим фрагментом кода git для четкого понимания конфигурации Webpack и т. д.   -  person Ravi Roshan    schedule 21.01.2017
comment
@Ravi - я отправляю изображения из папки dist (в моем случае она называется static). Пожалуйста, смотрите обновление, я предоставил более подробную информацию о дереве файлов и моих package.json и webpack.config.js.   -  person Paulos3000    schedule 21.01.2017
comment
@Paulos3000 Paulos3000: Поскольку вы используете абсолютный путь, Webpack не выдает никаких ошибок во время компиляции изображения. Все еще не могу понять, просто проверьте сетевое соединение вашего браузера - проверьте, куда оно указывает, или вы получаете какую-либо ошибку в консоли браузера. Кроме того, просто попробуйте поиграть с вашим ' publicPath: /js/, то есть используйте ' publicPath: /, и при импорте bundle.js в index.html внесите изменения. Я предполагаю, что вы используете Webpack-Dev-Server   -  person Ravi Roshan    schedule 21.01.2017


Ответы (2)


Я столкнулся с той же проблемой. Я обнаружил, что вы можете включить ?url=false в свой css-загрузчик, чтобы отключить обработку URL. Затем вы можете просто поместить изображение в свою общую папку для доступа css. Изображение не будет запускаться через веб-пакет, но оно избавит вас от ошибок компиляции веб-пакета и по-прежнему позволит получить доступ к изображениям.

Итак, вот мой новый объект в массиве module.loaders:

{
    test: /\.s?css$/,
    use: ExtractTextPlugin.extract({
        fallback: 'style-loader',
        use: ['css-loader?url=false', 'sass-loader']
    })
}
person strausd    schedule 15.01.2018

Хорошо, я нашел ответ на другой вопрос о переполнении стека: Webpack - фоновые изображения не загружаются

Оказывается, это была ошибка, вызванная исходной картой css-loader.

Я изменил это...

{
   test: /\.scss$/,
   loaders: [ 'style', 'css?sourceMap', 'sass?sourceMap' ]
}

...к этому:

{
   test: /\.scss$/,
   loaders: [ 'style', 'css', 'sass?sourceMap' ]
}

Надеюсь, что это поможет всем, кто сталкивается с этой проблемой, поскольку я потратил впустую несколько часов!

person Paulos3000    schedule 21.01.2017