У меня есть следующая конфигурация 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
:
:local .SomeClass {
background: url('/images/bg.png');
}
И я думаю, это потому, что root
определено для загрузчика CSS. Я получаю сообщение об ошибке сборки: Module not found: Error: Cannot resolve 'file' or 'directory' ./../../../../../../../../images/bg.gif
Если вместо этого я удалю root
из конфигурации css-loader, то он будет работать нормально, но тогда путь «выглядит» правильным в инспекторе Chrome, но когда вы на самом деле открываете ссылку в новой вкладке, она указывает на: chrome-devtools://devtools/bundled/"/images/bg.png"
что, очевидно, не решить правильно.
Я не уверен, связана ли проблема с конфигурацией url-loader
или что именно происходит.
Я играл с различными конфигурациями веб-пакетов, чтобы указать resolve.root, resolve.modulesDirectories и т. д., но совершенно не уверен, имеют ли они какое-либо влияние или я просто делаю это совершенно неправильно. Я также наткнулся на resolve-url-loader
, но не уверен, что это вообще то, что мне нужно.
Любые идеи? МТИА!
ОБНОВЛЕНИЕ
Я должен отметить, что он отлично работает в Safari, но не в Chrome. Так что это похоже на ошибку, специфичную для Chrome, но нецелесообразно выполнять всю нашу разработку в Safari.
Я также наткнулся на vue-style-loader, который является ответвлением style-loader. который утверждает, что решает эту проблему, но он решает ее, полагаясь на хакерский устаревший метод escape/unescape.