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 相关文章推荐
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
JavaScript中DOM详解
Apr 13 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
JS实现json对象数组按对象属性排序操作示例
May 18 Javascript
JavaScript ES6中的简写语法总结与使用技巧
Dec 30 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 Javascript
ant design pro中可控的筛选和排序实例
Nov 17 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
生成sessionid和随机密码的例子
2006/10/09 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
详解webpack 多入口配置
2017/06/16 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
python发送arp欺骗攻击代码分析
2014/01/16 Python
python如何重载模块实例解析
2018/01/25 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python从Oracle读取数据生成图表
2020/10/14 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
上海天奕面试题笔试题
2015/04/19 面试题
护士试用期自我鉴定
2014/02/08 职场文书
白酒市场营销方案
2014/02/25 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
财务会计专业求职信
2014/06/09 职场文书
学校开除通知书
2015/04/25 职场文书
中国合伙人观后感
2015/06/02 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
学校体育节班级口号
2015/12/25 职场文书