首页 文章

Webpack中的相对CSS URL

提问于
浏览
2

Webpack文件加载器sass-loader无法解析CSS背景图像的相对路径 .

已编译的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 .

File structure

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 回答

  • 0

    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 数组添加到特定目录中的目标文件 . 建议用于所有样式表位于同一文件夹中的实例 .

  • 3

    url(...) 中路径不正确的原因是webpack生成相对于输出目录的路径,而不是输出css文件 .

    您可以使用css-url-relative-plugin来解决此问题,它将通过重新计算输出css和资产文件的关系来用正确的相对路径替换 url(...) .

相关问题