webpack踩坑之路图片的路径与打包

发布时间 - 2026-01-11 03:07:03    点击率:

刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle)。下面我们就来分析下在webpack项目中图片的应用场景。

在实际生产中有以下几种图片的引用方式:

1. HTML文件中img标签的src属性引用或者内嵌样式引用

<img src="photo.jpg" />
<div style="background:url(photo.jpg)"></div>

2. CSS文件中的背景图等设置

.photo {
  background: url(photo.jpg);
}

3. JavaScript文件中动态添加或者改变的图片引用

var imgTempl = '<img src="photo.jpg" />';
document.body.innerHTML = imgTempl;

4. ReactJS中图片的引用

import React from 'react';
import ReactDOM from 'react-dom';

class App extends React.Component {
  render() {
    return (<img src='photo.jpg' />);
  }
}

ReactDom.render(<App />, document.querySelector('#container'));

url-loader

在 webpack 中引入图片需要依赖 url-loader 这个加载器。

安装:

npm install url-loader --save-dev

当然你可以将其写入配置中,以后与其他工具模块一起安装。

在 webpack.config.js 文件中配置如下:

module: {
  loaders: [
    {
      test: /\.(png|jpg)$/,
      loader: 'url-loader?limit=8192'
    }
  ]
}  

test 属性代表可以匹配的图片类型,除了 png、jpg 之外也可以添加 gif 等,以竖线隔开即开。

loader 后面 limit 字段代表图片打包限制,这个限制并不是说超过了就不能打包,而是指当图片大小小于限制时会自动转成 base64 码引用。上例中大于8192字节的图片正常打包,小于8192字节的图片以 base64 的方式引用。

url-loader 后面除了 limit 字段,还可以通过 name 字段来指定图片打包的目录与文件名:

module: {
  loaders: [
    {
      test: /\.(png|jpg)$/,
      loader: 'url-loader?limit=8192&name=images/[hash:8].[name].[ext]'
    }
  ]
}

 上例中的 name 字段指定了在打包根目录(output.path)下生成名为 images 的文件夹,并在原图片名前加上8位 hash 值。

例:工程目录如下

在 main.css 中引用了同级 images 文件夹下的 bg.jpg 图片

background-image: url(./images/bg.jpg);

通过之前的配置,使用 $ webpack 命令对代码进行打包后生成如下目录

打包目录中,css 文件和 images 文件夹保持了同样的层级,可以不做任务修改即能访问到图片。区别是打包后的图片加了 hash 值,bundle.css 文件里引入的也是有hash值的图片。

background-image: url(images/f593fbb9.bg.jpg);

(上例中,使用了单独打包css的技术,只是为了方便演示)

publicPath

output.publicPath 表示资源的发布地址,当配置过该属性后,打包文件中所有通过相对路径引用的资源都会被配置的路径所替换。

output: {
  path: 'dist',
  publicPath: '/assets/',
  filename: 'bundle.js'
}

main.css

background-image: url(./images/bg.jpg);

bundle.css

background-image: url(/assets/images/f593fbb9.bg.jpg);

该属性的好处在于当你配置了图片 CDN 的地址,本地开发时引用本地的图片资源,上线打包时就将资源全部指向 CDN 了。

但是要注意,如果没有确定的发布地址不建议配置该属性,否则会让你打包后的资源路径很混乱。

JS中的图片

初用 webpack 进行项目开发的同学会发现:在 js 或者 react 中引用的图片都没有打包进 bundle 文件夹中。

正确写法应该是通过模块化的方式引用图片路径,这样引用的图片就可以成功打包进 bundle 文件夹里了

js

var imgUrl = require('./images/bg.jpg'),
  imgTempl = '<img src="'+imgUrl+'" />';
document.body.innerHTML = imgTempl;

react

render() {
  return (<img src={require('./images/bg.jpg')} />);
}

HTML中的图片

由于 webpack 对 html 的处理不太好,打包 HTML 文件中的图片资源是相对来说最麻烦的。这里需要引用一个插件—— html-withimg-loder

$ npm install html-withimg-loader --save-dev

webpack.config.js 添加配置

module: {
  loaders: [
    {
      test: /\.html$/,
      loader: 'html-withimg-loader'
    }
  ]
}

在 bundle.js 中引用 html 文件

import '../index.html';

这样 html 文件中的图片就可以被打包进 bundle 文件夹里了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# webpack  # 图片打包路径  # 打包路径  # webpack配置打包后图片路径出错的解决  # vue webpack打包后图片路径错误的完美解决方法  # 详谈vue+webpack解决css引用图片打包后找不到资源文件的问题  # 浅谈webpack打包过程中因为图片的路径导致的问题  # webpack打包后直接访问页面图片路径错误的解决方法  # webpack 打包后图片加载报错的解决办法  # 里了  # 就可以  # 还可以  # 你可以  # 是有  # 是指  # 当你  # 中有  # 并在  # 将其  # 很容易  # 要注意  # 如果没有  # 就不能  # 几种  # 是说  # 不做  # 刚开始  # 时就  # 并不能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何实现数据库事务?(DB Facade示例)  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  如何快速搭建自助建站会员专属系统?  Android中AutoCompleteTextView自动提示  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Android仿QQ列表左滑删除操作  浅析上传头像示例及其注意事项  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  在线教育网站制作平台,山西立德教育官网?  Laravel如何配置和使用缓存?(Redis代码示例)  Python并发异常传播_错误处理解析【教程】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  详解jQuery停止动画——stop()方法的使用  韩国服务器如何优化跨境访问实现高效连接?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel如何实现用户密码重置功能?(完整流程代码)  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  公司网站制作价格怎么算,公司办个官网需要多少钱?  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何处理异常和错误?(Handler示例)  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何用狗爹虚拟主机快速搭建网站?  如何利用DOS批处理实现定时关机操作详解  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  JS去除重复并统计数量的实现方法  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何在新浪SAE免费搭建个人博客?  如何快速搭建高效WAP手机网站吸引移动用户?  JavaScript实现Fly Bird小游戏  香港服务器选型指南:免备案配置与高效建站方案解析  微信推文制作网站有哪些,怎么做微信推文,急?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  JS实现鼠标移上去显示图片或微信二维码  微信小程序 require机制详解及实例代码  如何选择可靠的免备案建站服务器?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  敲碗10年!Mac系列传将迎来「触控与联网」双革新  海南网站制作公司有哪些,海口网是哪家的?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  微信小程序 五星评分(包括半颗星评分)实例代码