2017-08-09 41 views
1

Webpack + file-loader + sass-loader在解析CSS背景圖片的相對路徑時遇到了麻煩。Webpack中的相對CSS url

編譯後的SCSS文件包含背景圖像的路徑,該路徑相對於/dist/而不是相對於SCSS/CSS文檔。我研究了這個問題; sass-loader建議使用resolve-url-loader(使用源地圖)。但是,添加resolve-url-loader對編譯後的CSS沒有任何影響。

我已經能夠通過在文件加載器上將'publicPath'設置爲'../ ..'來解決該問題。或者通過禁用css-loader的'url'設置。這兩者都不是一個好的解決方案,並且通過HTML或其他來源複製文件和引用圖像會導致問題。

的WebPack的和在線的例子CSS代替CSS和圖像在同一文件夾(通常在根)。這不是我的webpack實現的最佳選擇。在子文件夾中構建文件的概念似乎是一個相當基本的要求。這只是錯誤的方法?

運行Webpack^3.5.1。 Sass-loader^6.0.6。文件加載器^ 0.11.2。 Css-loader^0.28.4。

文件結構

example/ ├── dist/ │ ├── assets │ │ ├── media │ │ │ └── logo.png │ │ └── styles │ │ ├── app.css │ │ └── app.css.map │ ├── index.html │ └── app.bundle.js └── src/ ├── assets │ ├── media │ │ └── logo.png │ └── styles │ └── app.scss └── app.js

app.scss

body { background: url(../media/logo.png); }

app.css

body { background: url(assets/media/logo.png); //This should be ../media/logo.png }

app.js

require('./assets/styles/app.scss');

webpack.config.js

const path = require('path'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'app.bundle.js' }, devtool: 'source-map', module: { loaders: [ { test: /\.scss$/, use: ExtractTextPlugin.extract({ use: [ { loader: 'css-loader', options: { sourceMap: true } }, { loader: 'resolve-url-loader' }, { loader: 'sass-loader', options: { sourceMap: true } } ] }) }, { test: /\.png$/, use: [ { loader: 'file-loader', options: { name: 'assets/media/[name].[ext]' } } ] } ] }, plugins: [ new ExtractTextPlugin({ filename: 'assets/styles/app.css' }) ] }

回答

2

ExtractTextPlugin有publicPath選項,可以解決這個問題。

{ test: /\.scss$/, include: [ path.resolve(__dirname, "src/assets/styles") ], use: ExtractTextPlugin.extract({ publicPath: '../../', use: [ { loader: 'css-loader', options: { sourceMap: true } }, { loader: 'sass-loader', options: { sourceMap: true } } ] }) }

添加include陣列來定位在一個特定的目錄中的文件。建議用於所有樣式表位於同一文件夾中的情況。