【webpack】---url-loader 图片路径问题

webpack:url-loader 图片路径问题

我们使用webpack打包项目中,在处理图片路径时, 最常用的loader有两种, url-loader 和 file-loader。

我们在写项目中引用路径的时候,填写的URL是基于我们开发时的路径, 但是在webpack打包时, 会将各个模块打包成一个文件,里面引用的路径是相对于入口html文件,并不是相对于我们的原始文件路径的。loader 可以解析项目中引入的URL,并且根据配置,把图片拷贝到相应路径, 再将打包后的文件中的路径 替换为图像的最终路径。

file-loader 和 url-loader 都可以解决这个问题。 但是url-loader会将引入的图片进行编码, 我们引用的时候只需要引入这个文件就可以访问图片了, 可以大大减少 HTTP请求的次数。

url-loader 封装了 file-loader, 但并不依赖他, 所以我们可以只需要安装 url-loader就可以了。

在使用url-loader时,出现了 路径引用错误的 情况。

  1. 问题复现

webpack.prod.js

module.exports = {
    // ...
    rules: [
        // ...
        {
        test: /\.(png|svg|jpg|gif)$/,
        use: [
            // ...
            {
                loader: ‘url-loader‘, //是指定使用的loader和loader的配置参数
                options: {
                    limit:500,  //是把小于500B的文件打成Base64的格式,写入JS
                    name: ‘images/[name]_[hash:7].[ext]‘,
                }
            }
        ]
        },
        {
            test: /\.(css)$/,
            use: [
                MiniCssExtractPlugin.loader,
                {
                    loader: ‘css-loader‘,
                }
            ]
    ],
}

复制代码

index.js

import React from ‘react‘;
import ReactDom from ‘react-dom‘;
import ‘./index.scss‘;
import logo from ‘./logo.png‘;

ReactDom.render(
    <div>Hello world
        <img src={logo} />
    </div>,
    document.getElementById("root")
);

复制代码

index.css

#root {
    color: aqua;
    background: url(‘./logo.png‘);
};
复制代码

打包后的 css 文件

#root{background:url(images/logo_e179a47.png);color:#0ff}
复制代码

打包后 的 文件结构

── css

│   └── app.9fd7e730df40df61cc5a.css

├── images

│   └── logo_e179a47.png

├── js

│  └── app.382da24eb9c30ee2.js

└── index.html

我们在浏览器中打开打包后的 index.html

可以看出我们在index.js 中 引入的图片是可以正常加载的, 但是我们在css中引入的背景图 并没有加载成功。

  1. 问题原因

webpack 在 打包时, 首先会把图片 复制到 /dist/images/ 文件夹下, 然后把 css 文件中的url 路径 替换为webpack中options的name属性指向的路径,即 /images/logo.png, 但是这个路径是相对路径,是相对于 /dist/css/~.css 来说的, 所以此处引用的 文件地址为: /dist/css/images/logo.jpg。 但是我们打包后的css 文件夹中, 并没有 images/logo.png, 所以图片并没有渲染出来。 但是 对于 我们 index.js 中 引用的图片, 此处相对路径是相对于 index.html 来说的, 所以 是可以取到图片的。

  1. 解决方式
 {
    test: /\.(css)$/,
    use: [
        {
            loader: MiniCssExtractPlugin.loader,
            options: {
                publicPath: ‘../‘,
            }
        },
        {
            loader: ‘css-loader‘,
        }
    ]
},
复制代码

在为css文件配置 loader时, 添加 publicPath 属性。 这样做, 我们在图片打包时, 仍会将图片复制在 /dist/images/ 文件夹之下, 但是 在css文件中引用时, 会将路径替换为 publicPath + name。

打包后的 css 文件:

#root{background:url(../images/logo_e179a47.png);color:#0ff}
复制代码

至此, 项目中 css 的文件引用路径 和 js 中的文件引用路径 均为正确的图片路径。

https://juejin.im/post/5b8d1e926fb9a019b66e4657

原文地址:https://www.cnblogs.com/zjt-blogs/p/10990228.html

时间: 2024-10-11 21:18:53

【webpack】---url-loader 图片路径问题的相关文章

求助,关于webpack url-loader配置图片路径错误的问题

这是我css文件图片引入的位置 这是我的webpack配置 最后就会出现这种路径,如果我把url-loader的输出名改成name=../images/[name].[ext],这样它会把图片输出到dist同级的位置,而不是dist目录内,求教怎么解决! 回答:你得配置个output.publicPath参数,我观察你的文件目录结构,初步建议你配成publicPath: './dist',如果在浏览器里路径报错了,你可以参照着你自己的文件目录结构来改下这相对路径.

透过现象看webpack处理css文件中图片路径转换的具体过程

webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也包括css文件中图片资源的处理,那么webpack到底是怎么处理它的呢?笔者之前也遇到过类似图片路劲的问题,为此还写过一篇博文webpack生成的css文件background-image url图片无法加载.今天就来说说webpack是怎么处理css文件中的图片路径的,首先上一个具体的例子. 一个

Web前端学习(4):显示图片、url与文件路径

本章主旨 介绍<img>标签及其基本属性:介绍URL和文件路径 在上一章中,我简单地介绍了HTML的一些基本标签及基本属性,例如,我们用<p>标签来标记文本段落,用<h1>~<h6>来设置多级标题,用<a>标签及其href属性来设置超链接.而在这章我将介绍如何在网页中显示图片图片,同时也会介绍有关于文件路径的知识. 一.如何在网页中显示图片 HTML文档是纯文本文档,所以图片不能像WORD文档那样直接插到文件中.那么我们该如何在网页上显示图片呢?

Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决

Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决 1. #原因解析 1 2. #解决方式 2 3. 输出图片流... 2 4. --code 2 5. 参考 3 1. #原因解析 查看累挂发送d url,,,俄使用的是ff..它把url转换成个 http://localhost/img/QQ%E6%88%AA%E5%9B%BE20140401175433.jpg 发送出去..每汉字3个%字符,

jQuery获取和设置disabled属性、背景图片路径

之前对于这个独特的disabled属性获取和设置很混乱,今天项目中用到了,用attr不能实现,于是多次试验得出: 获取disabled属性用prop $("#basic_key").prop("disabled") 以上会返回true或false. 然后设置disabled是attr,重点是后面的一个参数不加引号: $("#basic_key").attr("disabled",'false') //false加引号是错误的~

MVC中用 BundleCollection 压缩CSS时图片路径问题

MVC中有个专门提供JS和CSS压缩的类,BundleCollection,其实这个类也可以在asp.net中用, 关于BundleCollection类的详细推荐个地址:http://www.cnblogs.com/lifeil/archive/2013/03/11/2954071.html 我这里只是记录下使用过程中遇到的两个小问题 1.css被压缩后,里面图片路径文件的问题 我们可以看到MVC中 BundleConfig这个类里,都是自动生成的好多需要压缩的JS和CSS bundles.A

网站更换了域名图片路径批量修改的方法

我们有可能会问,我们要是换域名了,做的网站怎么修改图片路径啊,换域名之后网站所有文章和软件的图片都不显示了,因为织梦上传图片用的是绝对地址,如果域名更换后,之前发布的文章的图片URL是不会跟着改变的,所以我们需要把旧域名替换成新的域名,方法很简单,有一段SQL语句更新一下文章正文内容就行. 复制下面SQL语句进织梦DedeCms的后台,点 系统 -> SQL命令行工具,然后看到一个文本框,在文本框内输入SQL语句,按确定之行.如果操作成功,上面会提示"成功执行x个SQL语句!"

IE6兼容png24透明滤镜写法图片路径是以页面为基点

background:url(logo2.png) no-repeat; _background-image:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='logo2.png'); 注意:滤镜的图片路径是以页面为基点,并非以CSS文件. IE6兼容png24透明滤镜写法图片路径是以页面为基点

减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

原文:减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术) 在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”,那么,这一篇博文将讲解  “ 将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片”. 一.为何选择将图片转成二进制并生成Base64编码,可以在网页中通过url查看