webpack之引入图片的实现及问题


Posted in Javascript onOctober 08, 2018

前言:

本文演示了

  1. webpack如何在css文件中引入图片;
  2. webpack如何在html中引入图片;

需要安装配置的loader: file-loader;

为何要使用file-loader:

如果我们希望在页面引入图片(包括img的src和background的url)。当我们基于webpack进行开发时,引入图片会遇到一些问题。

其中一个就是引用路径的问题。拿background样式用url引入背景图来说,我们都知道,webpack最终会将各个模块打包成一个文件,因此我们样式中的url路径是相对入口html页面的,而不是相对于原始css文件所在的路径的。这就会导致图片引入失败。这个问题是用file-loader解决的,file-loader可以解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,再根据我们的配置,修改打包后文件引用路径,使之指向正确的文件。

安?file-loader

$ npm i -D file-loader

package.json目前配置:

webpack之引入图片的实现及问题

配置webpack.config.js

webpack之引入图片的实现及问题

在common下新增img文件夹,并添加图片dog.jpeg。

我目前用的项目目录:

webpack之引入图片的实现及问题

示例一、在css中引入我们的图片

编写main.css

webpack之引入图片的实现及问题

在我们的app.js中引入main.css

webpack之引入图片的实现及问题

执行 npm run build构建项目。

示例二、在html中引入图片:重新编辑我们的app.js

webpack之引入图片的实现及问题

执行 npm run build构建项目。

PS:webpack和图片引入的一些问题

问题描述

  • 需要使用<img>标签引入多个图片
  • 理想方案是将图片的相关信息(图片文字,图片相对路径)整合到一个数组imageList
  • 然后对imageList做一个map render出图片列表
const imageList = [
 {id:1,info:'中国银行',uri:'./assets/1.jpg'},
 {id:2,info:'中国农业银行',uri:'./assets/2.jpg'},
 {id:3,info:'中国建设银行',uri:'./assets/3.jpg'}
]

imageList.map((img)=>{
  return (
  <div>
   {img.info}
   <img src={img.uri} />
  </div>
  )
})

但是这样做导致了图片无法找到

发现请求图片路径出现了问题:所有图片请求的路径变成了当前的url拼接uri

换成import image from './assets/1.jpg'将image给src就可以拿到图片

发现这是webpack引入图片的方式

问题原因

Q1:这两种方式的区别?

A2:主要是资源路径的不同

  1. 赋给src相对路径:导致资源请求的路径变成:当前url+src的值
  2. 赋给src import的文件:首先使用import可以返回一个字符串这个字符串是文件被打包之后(在静态目录下)的绝对路径。因此当前请求图片的路径就会变成:端口号+import的值

最后请求图片的路径很好解释:

  • 如果src的值以slash开头那么会被认为是以静态文件为根目录的绝对路径
  • 如果src的值不以slash开头那么会被认为是当前路径的相对路径

总结为:静态服务器可以被当做文件系统看待,这些uri就是文件路径

Q2:图片是如何被webpack打包的?

A2: 仅对于图片的import:

打包时机:在项目中的图片并不是都会被打包的,经过尝试发现通过import或者background:url(image path)引入的图片才会被打包

打包位置:通过对file-loader的设置

{
test: /\.(jpg|png|svg|pdf)$/,
exclude: /font.*\.svg$/,
loader: 'file-loader?name=[path][name].[hash].[ext]'
}
//根据这样的设置,webpack会将所有**使用到的图片全部加载到当前path并且名字不变但是加上.hash.后缀**

Q3: img src的值可以是什么?background:url的值又可以是什么?

A3:

img src:

  1. 路径(url)
  2. require(或者import的值)
  3. data url(base64)

background:url:

  1. 路径(相对)
  2. data url(base64)

Q4:为什么在css中使用background-url()可以使用图片的相对路径但是在js文件中就不能使用相对路径赋值给src?

A4: 首先先说明我发现的区别

  1. src:会发请求,请求静态的外部文件资源(只要是src不论值是什么(除base64)都会发送请求)
  2. css background:不会发送请求

webpack对他们的处理方式也完全不同:

  • - src:url :不会被webpack处理
  • - src:require():会被webpack处理
  • - background:url:会被webpack处理

总结:使用import或者require或者background都会被webpack的file-loader当做依赖模块处理:

  • - 打包的时候执行到引入部分(import。。。)
  • - 将对应的静态文件打包到配置好的位置
  • - 生成打包后的绝对路径赋值给引入部分

Q5:客户端图片引入的方式有几种?他们分别有什么不同的原理?

A5:所谓客户端图片:就是不想通过http请求的方式获取的图片

  • 通过background:url('./****')
  • 通过background:url(图片base64)
  • 通过src=图片base64
  • 通过src=require('./******')

其他知识

K1:到今天终于明白file-loader的作用

当其他模块需要引用文件,file-loader就将对应文件依照name属性要求的文件路径和文件名进行打包。通过计算文件大小,小于limit的值,就将文件转成base64赋给需要这些文件的位置,大于limit的值就将文件的打包后路径赋给需要这些文件的位置

我的疑问:

网上有~说是作为src值的开头可以将这部分的请求作为依赖模块处理但是我没有尝试成功

我的解决方案

  • 由于我还不知道该如何给background-url编程循环引入图片所以我决定采用:
  • 因此我采用编写一个对象数组,对对象数组进行map,return<img src={require(bank.img+'')}>
const BANK_LIST = [
 {name: '中国银行', img: './assets/bank-logo-6.png', id: 1},
 {name: '中国建设银行', img: './assets/bank-logo-7.png', id: 2},
 {name: '兴业银行', img: './assets/bank-logo-8.png', id: 3}
]

BANK_LIST.map((bank)=>{
  return (
    <img src={require(bank.img+'')} />
  )
})

我的另外一种解决方案(由于项目中的eslint要求不支持动态引入文件)

使用webpack带的require.context('pathToDirectory')他可以循环的将一个目录下的所有文件引入

const BANK_LIST = {
 './bank-logo-6.png': {name: '中国银行', id: 1},
 './bank-logo-7.png': {name: '中国建设银行', id: 2},
 './bank-logo-8.png': {name: '兴业银行', id: 3}
 }

 const pathToImages = require.context('./assets');
 const originalBankList = pathToImages.keys().map((key) => {
 return Object.assign({}, BANK_LIST[key], {url: pathToImages(key)})
 });
 
//这时候originalBankList的每一项会变成
{name: '中国银行', id: 1,url: "/app/src/containers/WisePort/CheckoutCounterContai…/bank-logo-1.9f949c516315756e18c0cb7d572f4d2c.png"'}

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

Javascript 相关文章推荐
几个高效,简洁的字符处理函数
Apr 12 Javascript
读jQuery之五(取DOM元素)
Jun 20 Javascript
js模拟hashtable的简单实例
Mar 06 Javascript
JavaScript实现职责链模式概述
Jan 25 Javascript
jQuery实现模糊搜索功能的方法分析
Jun 29 jQuery
Angular 利用路由跳转到指定页面的指定位置方法
Aug 31 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
Sep 03 Javascript
js中的闭包实例展示
Nov 01 Javascript
从0到1搭建element后台框架优化篇(打包优化)
May 12 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
Aug 26 Javascript
javascript实现智能手环时间显示
Sep 18 Javascript
帮你提高开发效率的JavaScript20个技巧
Jun 18 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 #Javascript
JS中验证整数和小数的正则表达式
Oct 08 #Javascript
webpack@v4升级踩坑(小结)
Oct 08 #Javascript
npm scripts 使用指南详解
Oct 08 #Javascript
webpack4.0 入门实践教程
Oct 08 #Javascript
vue实现一个炫酷的日历组件
Oct 08 #Javascript
angularJs利用$scope处理升降序的方法
Oct 08 #Javascript
You might like
php时区转换转换函数
2014/01/07 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
python如何使用代码运行助手
2020/07/03 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
面向对象编程的优势是什么
2015/12/17 面试题
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
行政人事经理职位说明书
2014/03/05 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
自动一体化专业求职信
2014/03/15 职场文书
企业党员公开承诺书
2014/03/26 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers