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


Posted in Javascript onSeptember 05, 2017

刚开始用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 值。

例:工程目录如下

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

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

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

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

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 文件夹里了。

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

Javascript 相关文章推荐
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
jquery zTree异步加载简单实例讲解
Feb 25 Javascript
AngularJS动态生成div的ID源码解析
Aug 29 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
jQuery插件zTree实现的多选树效果示例
Mar 08 Javascript
详解封装基础的angular4的request请求方法
Jun 05 Javascript
在vue中安装使用vux的教程详解
Sep 16 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
mocha的时序规则讲解
Feb 16 Javascript
微信小程序云开发之云函数详解
May 16 Javascript
vue 开发之路由配置方法详解
Dec 02 Javascript
实现一个简单得数据响应系统
Nov 11 Javascript
js实现鼠标跟随运动效果
Aug 02 #Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
Sep 05 #Javascript
javascript观察者模式实现自动刷新效果
Sep 05 #Javascript
js使用generator函数同步执行ajax任务
Sep 05 #Javascript
vue如何使用 Slot 分发内容实例详解
Sep 05 #Javascript
详解Vue2.0 事件派发与接收
Sep 05 #Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 #Javascript
You might like
极典R601SW收音机
2021/03/02 无线电
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Python多项式回归的实现方法
2019/03/11 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
python爬虫用mongodb的理由
2020/07/28 Python
介绍一下内联、左联、右联
2013/12/31 面试题
会计专业大学生求职信范文
2014/01/28 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
医学求职信
2014/05/28 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书