Не удалось разрешить абсолютные пути url () для фоновых изображений в CSS с помощью Webpack

у меня есть следующая конфигурация Webpack (грубо говоря, она была упрощена для этого поста):

const rootPublic = path.resolve('./public');
const LOCAL_IDENT_NAME = 'localIdentName=[name]_[local]_[hash:base64:5]';
const CSS_LOADER = `css?sourceMap&${LOCAL_IDENT_NAME}&root=${rootPublic}`;
const SASS_LOADER = 'sass?sourceMap&includePaths[]=' + path.resolve(__dirname, './src/styles');

// ... loaders:

loaders: [
  {
    test: /.(jpe?g|png|gif|svg)$/,
    loader: 'url-loader?limit=10000&name=[path][name].[ext]'
  },
  {
    test: /.scss$/,
    loader: config.DEVELOPMENT_MODE ? `style!${CSS_LOADER}!autoprefixer!${SASS_LOADER}`
                : ExtractTextPlugin.extract('style', `${CSS_LOADER}!autoprefixer!${SASS_LOADER}`)
  }, // ...
]

теперь это отлично работает для изображений, на которые обычно ссылаются в файлах scss:

.some-static-class {
  background: url('/images/bg.png');
}

однако,не при использовании :

:local .SomeClass {
  background: url('/images/bg.png');
}

и я думаю, что это потому что root определяется для загрузчика CSS. Я получаю ошибку сборки:Module not found: Error: Cannot resolve 'file' or 'directory' ./../../../../../../../../images/bg.gif

если вместо этого я удаляю root от css-loader config, затем он строит нормально, но затем путь "выглядит" правильным в инспекторе Chrome, но когда вы фактически открываете ссылку на новой вкладке, он указывает на:chrome-devtools://devtools/bundled/"/images/bg.png" что явно не правильно.

Я не уверен, что проблема заключается в url-loader config, или что именно происходит.

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

какие идеи? Приводе mtia!

обновление

я должен отметить, что он отлично работает в Safari, но не в Chrome. Таким образом, это похоже на ошибку Chrome, но это не практично, чтобы сделать все наши разработки в Safari.

я тоже сталкивался, Vue-style-loader, которое вилка стиль-затяжелителя это утверждает, чтобы исправить эту проблему, но так, как она исправляет это, полагаясь на хакерский устаревший метод escape/unescape.

2 ответов


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

использовать resolve-url-loader (сразу после sass-loader):

style!${CSS_LOADER}!autoprefixer!resolve-url!${SASS_LOADER}

затем определите решения.псевдоним для статических изображений:

resolve: {
  alias: {
    images: path.join(__dirname, 'public/images')
  }
}

и затем в CSS, вы можете указать на изображения, как так:

:local .SomeClass {
  background: url('images/bg.png');
}

в зависимости от вашей структуры URL, вам также может потребоваться настроить url-loader имя param:

{
  test: /\.(jpe?g|png|gif|svg)$/,
  loader: 'url-loader?limit=10000&name=images/[name].[ext]'
}

поэтому я не знаю, есть ли более чистый способ решить эта проблема, но это лучшее, что я мог придумать до сих пор. Я приветствую любые отзывы или альтернативы.

спасибо!

обновление 6/30/2016

есть пара PR, которые будут решать эту проблему, но сопровождающий предпочитает, чтобы решение было в CSS AST, а не в CSS погрузчик...

https://github.com/webpack/style-loader/pull/124 https://github.com/webpack/style-loader/pull/96

здесь надеется, что с этим произойдет в ближайшее время...


С webpack 2:

в вашей .файлы scss используют ~ перед путем.

.yourClass {
      background: url('~img/wallpaper.png');
}

используйте корень разрешения из webpack, добавьте это в свой webpack.конфиг.js:

resolve: {
        modules: [
            path.resolve(root),
            'node_modules'
        ]
    },

Он должен работать также для @import, например @import " ~otherfile.scss"