webpack - 无法使用 Webpack 解析 CSS 中背景图像的绝对 url() 路径

标签 webpack webpack-dev-server urlloader webpack-style-loader

我有以下 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 加载器定义的。我收到构建错误: 找不到模块:错误:无法解析"file"或“目录”./../../../../../../../../图片/bg.gif

如果我从 css-loader 配置中删除 root ,那么它构建得很好,但路径在 Chrome 的检查器中“看起来”正确,但是当您实际在新选项卡中打开链接时,它指向: chrome-devtools://devtools/bundled/"/images/bg.png" 显然无法正确解析。

我不确定问题是否出在 url-loader 配置上,或者到底发生了什么。

我尝试使用不同的 webpack 配置来指定resolve.root、resolve.modulesDirectories 等,但完全不确定它们是否有任何影响,或者我是否完全错误地处理它。我还遇到了 resolve-url-loader 但不确定这是否是我所需要的。

有什么想法吗? MTIA!

更新

我应该注意到,它在 Safari 中工作正常,但在 Chrome 中却不行。所以这看起来像是一个特定于 Chrome 的错误,但在 Safari 中进行所有开发是不切实际的。

我还遇到了 vue-style-loader ,它是 style-loader 的一个分支,声称可以解决这个问题,但它解决这个问题的方法是依靠一种 hacky 已弃用的 escape/unescape 方法。

最佳答案

我能想到的一个可能的解决方案如下:

使用resolve-url-loader(紧接在sass-loader之后):

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

然后,为静态图像定义一个resolve.alias:

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

然后在 CSS 中,您可以像这样指向图像:

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

根据您的 URL 结构,您可能还需要调整 url-loader 名称参数:

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

所以我不知道是否有更干净的方法来解决这个问题,但这是迄今为止我能想到的最好的方法。我欢迎任何反馈或替代方案。

谢谢!

更新 2016 年 6 月 30 日

有几个 PR 可以解决这个问题,但维护者更喜欢将解决方案放在 CSS AST 中,而不是放在 CSS 加载器中......

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

希望真正的修复很快就会发生......

关于webpack - 无法使用 Webpack 解析 CSS 中背景图像的绝对 url() 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35786100/

相关文章:

javascript - react 错误: unknown word when using webpack

webpack - webpack-dev-server 可以提供多个 HTML 文件吗?

actionscript - 如何访问 AS3 URLLoader 在 IOErrorEvent 上返回数据

javascript - webpack - scss 无法解析背景图像 url

webpack - 无法使用 node 12.0.0-pre 和 npm 6.6.0 OSX 安装 Webpack

webpack - postcss 处理问题

node.js - Webpack @font-face 相对路径问题

webpack - 如何修复这些 SockJS ssl 错误?

reactjs - Webpack - url-loader 无法解析 jpg

javascript - 通过 Webpack 5 构建后,应用程序在 Internet Explorer (IE11) 上停止工作