Подтвердить что ты не робот

Webpack css-loader не находит изображения в URL-адресе url() во внешней таблице стилей

Я новичок во всем мире Node/NPM/Webpack, поэтому извиняюсь, если это очевидно.

Я пытаюсь создать простой внешний проект в комплекте с Webpack. У меня установлен node и настроен файл package.json. Если я запускаю "npm start" в моем корневом каталоге, я не получаю никаких ошибок с консоли, и я могу перейти на "localhost: 3000" в браузере и посмотреть мой "привет, мир".

Моя следующая задача - включить таблицу стилей, которая содержит ссылку на изображение, например:

.myimg {background: url(path/to/file.jpg);}

С настройками, подобными этому, я могу просмотреть изображение через webpack-dev-сервер (перейдя на localhost: 3000 в веб-браузере), но если я создам проект, путь к изображению неверен. Я понятия не имею, что я делаю неправильно, поэтому я бросаю это в Stackiverse в надежде, что кто-то там узнает, какую глупую вещь я делаю.

Вот мой файл package.json:

{
  "name": "webpack-test1",
  "version": "0.0.1",
  "description": "My project WTF.",
  "private": true,
  "scripts": {
    "start": "node server.js"
  },
  "devDependencies": {
   "css-loader": "^0.15.2",
   "file-loader": "^0.8.4",
   "style-loader": "^0.12.3",
   "url-loader": "^0.5.6"
  },
  "dependencies": {
    "webpack": "^1.9.6",
    "webpack-dev-server": "^1.8.2"
  }
}

... и вот мой файл webpack.config.js:

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

module.exports = {
  entry: [
    "./src/start.js"
],
output: {
    filename: "bundle.js",
    path: path.join(__dirname, 'build'),
    publicPath: '/build/'
},
module: {
    loaders: [
        { test: /\.css$/, loader: 'style-loader!css-loader' },
        { test: /\.(png|jpg)$/, loader: 'file-loader' }
    ]
}

};

... и затем файл index.html:

<!doctype html>
<html>
<head>
    <title>Webpack Test</title>
</head>

<body>
    <div class="imgtest">hello, world</div>
    <script src="build/bundle.js"></script>
</body>
</html>

... файл "start.js", указанный в файле конфигурации:

require('./test.css');
console.log("y u no work?");

... и, наконец, содержимое самого файла css:

.imgtest { background: url(img/volcano.jpg);}

Как я уже сказал наверху, в мире webpack-dev-server путь к изображению разрешается правильно, и он отображается как фон элемента DOM. В опубликованном мире браузер говорит мне, что он не может найти файл, а в консоли Safari явно отображается неправильный путь к файлу:

http://localhost/build/1b05d814aa13ac035c6b122b9f5974f8.jpg

Правильный локальный путь:

http://localhost/~username/webpack1/build/1b05d814aa13ac035c6b122b9f5974f8.jpg

Ясно, что я делаю что-то неправильно, но я не могу понять, что. Любая помощь или совет приветствуются.

Спасибо!

4b9b3361

Ответ 1

Хорошо... тьфу. Я просто понял это. Проблема была в переменной publicPath внутри webpack.config.js. У меня было это:

publicPath: '/build/'

... что в ретроспективе, очевидно, является абсолютным путем. Вместо этого мне было нужно:

publicPath: './build/'

... который является относительным путем. Сейчас все работает.

UPDATE:

Я все еще очень новичок в Webpack, так что все это все еще довольно запутанно. Сказав это...

Думаю, я поступил неправильно. У моего проекта Webpack был файл index.html в корне проекта, и я пытался использовать его как файл, на который попал webpack-dev-сервер, и то, что будет использоваться в качестве точки входа. Это не вызывало у меня никаких головных болей, и я не думаю, что какое-либо решение, с которым я столкнулся, действительно сработало. Тогда я нашел это:

https://www.npmjs.com/package/html-webpack-plugin

Это позволяет вам создать страницу index.html из шаблона, что означает, что на самом деле он не должен существовать в виде файла. webpack-dev-server создает его на лету и сохраняет его в памяти, а когда вы публикуете в своей папке "build", в этой папке создается файл index.html.

Возможно, существует верный "правильный" способ справиться с проблемой, которую я здесь затронул, но, похоже, она работает очень хорошо, и она обходится без проблем, поскольку она полностью устраняет весь вопрос.

Во всяком случае, это своего рода бессвязное отношение. Я надеюсь, что это поможет кому-то, и/или я надеюсь, что кто-то, кто знает об этом больше, приходит сюда и устанавливает меня прямо.

Ответ 2

ОШИБКА, с которой я столкнулся, была

Module parse failed: PATH:\TO\IMG\XYZ.PNG  Unexpected character '�' (1:0)
 You may need an appropriate loader to handle this file type.
 SyntaxError: Unexpected character '�' (1:0)

.
.
.
.
.
@ ./~/css-loader!./~/sass-loader!./node/static/sass/style.scss 6:399692-399747

Это решает мою проблему:

module: {
.
.
.,{
       test: /\.scss$/,
       exclude: /node_modules/,
       loader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader"),
       root: path.resolve('./node/static/sass')
   },
   {
     test: /\.(jpe?g|gif|png)$/,
     loader: 'file-loader?emitFile=false&name=[path][name].[ext]'
    }
  ]}

Запустите свой веб-пакет еще раз.

Добавить весь фон: url('~/../somePath/toImage.png');

> [email protected] react-build PATH:\TO\PROJECT
> webpack --watch --display-error-details --display-cached --content-base ./

Hash: f6e4cbbf0068b5792247
Version: webpack 1.13.2
Time: 4882ms
         Asset    Size  Chunks             Chunk Names
  js/bundle.js  760 kB       0  [emitted]  main
css/bundle.css  393 kB       0  [emitted]  main
    + 180 hidden modules
Child extract-text-webpack-plugin:
        + 76 hidden modules

чтобы коротко объяснить, что делает загрузчик файлов - он копирует файл в новый путь и помещает этот путь в css, поскольку мой файл CSS был вложен в какую-либо общую папку, тогда как загрузчик файлов вставлял его в корневой каталог public, с path = [path], определенным, он все равно будет обрабатывать относительный путь. Таким образом, отключение этого полностью решает мою проблему относительных путей и добавляет, что у меня есть папка с вложенными изображениями, так что это уклоняется от проблемы разрешения этих путей. И двойная копия того же изображения - это то, что мне не нужно.