webpack - Webpack 中的相对 CSS url

标签 webpack css-loader sass-loader

Webpack + file-loader + 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 加载程序 ^6.0.6。文件加载器 ^0.11.2。 CSS 加载器 ^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'
    })
  ]
}

最佳答案

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数组到特定目录中的目标文件。推荐用于所有样式表都位于同一文件夹中的情况。

关于webpack - Webpack 中的相对 CSS url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45597788/

相关文章:

javascript - 使用 Node 和 Webpack 在 Heroku 上托管 -- 未找到模块,无法解析 './Navbar'

webpack - 带有 HTML Webpack 插件的 Pug 模板

css - Sass 变量更改为 css 变量?

javascript - webpack css-loader localIdent 名称哈希长度

javascript - Webpack 未构建 css 文件

webpack - angular-cli 新项目中的 webpack.config.js 在哪里?

webpack - 在 less-loader 中导入全局变量

Webpack - 在所有其他 scss 模块中自动包含一个配置 scss 文件

Webpack sass-loader、css-loader 与 scss 文件中的 font-face 中断

javascript - 图片不在生产构建中显示,仅在开发中显示(webpack/sass-loader)