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(1.3.2) 7行代码搞定跟随屏幕滚动的层
May 21 Javascript
javascript 数组学习资料收集
Apr 11 Javascript
javascript操作数组详解
Dec 17 Javascript
BootStrap中的表单大全
Sep 07 Javascript
JS验证码实现代码
Sep 14 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
vue-cli与webpack处理静态资源的方法及webpack打包的坑
May 15 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
Jul 26 Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 Javascript
微信小程序实现倒计时功能
Nov 19 Javascript
如何在JavaScript中正确处理变量
Dec 25 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
新版PHP极大的增强功能和性能
2006/10/09 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Fiddler如何抓取手机APP数据包
2016/01/22 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
结婚典礼证婚词
2014/01/11 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
职工食堂管理制度
2015/08/06 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android