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 相关文章推荐
一个用js实现的页内搜索代码
May 23 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
Oct 22 Javascript
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
jquery tablesorter.js 支持中文表格排序改进
Dec 09 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
js获取html参数及向swf传递参数应用介绍
Feb 18 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
jQuery表单插件ajaxForm实例详解
Jan 17 Javascript
利用JS测试目标网站的打开响应速度
Dec 01 Javascript
vue2.0 路由不显示router-view的解决方法
Mar 06 Javascript
Electron 如何调用本地模块的方法
Feb 01 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文件操作实例代码
2012/05/10 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
原生小程序封装跑马灯效果
2020/10/21 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
茶叶店创业计划书范文
2014/01/19 职场文书
销售竞赛活动方案
2014/08/23 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
2015年技术员工作总结
2015/04/10 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
python 实现图片特效处理
2022/04/03 Python
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS