如何修复webpack resolve-url-loader无法正常工作?

时间:2019-06-17 20:40:01

标签: webpack path resolution resolve-url-loader

Resolve-url-loader 不能解析 css文件中的图像/字体我的文件夹结构如下:

src 
   public
      images
           -banner-bg.jpg
      stylesheets
         css
           -basic.css with background: url(../../images/banner-bg.jpg)
         scss
           -main.scss with @import "../css/basic.css";

输出文件夹:

dist
  public
     images
           -banner-bg.jpg
     stylesheets
           -main-output.css

图像和字体在开发服务器中正常显示,并已在生产中正确复制。 main-output.css -经过检查-显示

background:url(public/images/banner-bg.jpg

而不是预期的

background:url(../images/banner-bg.jpg)

浏览器控制台显示错误:

获取文件:/// home / ustrd / Documents / myproject12 / dist / public / stylesheets / public / images / banner-bg.jpg net :: ERR_FILE_NOT_FOUND

plugins: [
   new MiniCssExtractPlugin({
     filename: path.join("public", "stylesheets", "[name].css")
   })
 ],
 module: {
   rules: [
     {
       test: /\.(css|scss)$/,
       use: [
         MiniCssExtractPlugin.loader, 
         {
           loader: "css-loader",
           options: {
             sourceMap: true,
             importLoaders: 2
           }
         },
         {
           loader: "postcss-loader",
           options: {
             ident: "postcss",
             plugins: () => [new PostcssPresetEnv()]
           }
         },
         {
           loader: "resolve-url-loader",
           options: { sourceMap: true }
         },
         { loader: "sass-loader", options: { sourceMap: true } } 
       ]
     },

有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

我猜想resolve-url-loader不知道最终main-output.css的位置,并且希望它位于dist的屋顶。 您可以尝试使用自定义join函数来修复路径:

{
  loader: "resolve-url-loader",
  options: {
    sourceMap: true,
    join: (uri, base) => path.join('../..', base, uri);
  }
},

这应该输出如下内容:

background:url(../../public/images/banner-bg.jpg)

虽然没有测试。查看how-it-works了解更多详细信息。还要看看css-loader url的设置。

更改main-output.css的位置可能更容易:

new MiniCssExtractPlugin({
     filename: "[name].css"
})