webpack file-loader和url-loader的区别


Posted in Javascript onJanuary 15, 2019

1.前言

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

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

另外,如果图片较多,会发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURl。相当于把图片数据翻译成一串字符。再把这串字符打包到文件中,最终只需要引入这个文件就能访问图片了。当然,如果图片较大,编码会消耗性能。因此url-loader提供了一个limit参数,小于limit字节的文件会被转为DataURl,大于limit的还会使用file-loader进行copy。

url-loader和file-loader是什么关系呢?简答地说,url-loader封装了file-loader。url-loader不依赖于file-loader,即使用url-loader时,只需要安装url-loader即可,不需要安装file-loader,因为url-loader内置了file-loader。通过上面的介绍,我们可以看到,url-loader工作分两种情况:1.文件大小小于limit参数,url-loader将会把文件转为DataURL;2.文件大小大于limit,url-loader会调用file-loader进行处理,参数也会直接传给file-loader。因此我们只需要安装url-loader即可。

推荐文档:

file-loader: https://github.com/webpack-contrib/file-loader

url-loader: https://3water.com/article/122936.htm

2.loader中的参数

上面提到url-loader的参数和file-loader的参数,那么loader的参数是个什么概念呢?loader的参数用来自定义loader处理文件时的工作特性。下面以url-loader为例,介绍一下webpack的loader中的参数。

首先看下面的例子:

module.exports = {
 // 入口文件路径,__dirname是根目录
 entry: __dirname + '/src/main.js',
 // 打包生成文件
 output: {
  path: __dirname + '/output',
  filename: 'main.js'
 },
 
 module: {
  rules: [
   {
    test: /\.css$/,
    use: ['style-loader', 'css-loader']
   },
   {
    test: /\.jpeg$/,
    use: [
     {
      loader: 'url-loader',
      options: {
       limit: '1024'
      }
     },
    ]
   }
  ]
 }
}

其中,url-loader的配置中的options属性表示的就是url-loader的参数,还有一种等价的写法:

{
 test: /\.jpeg$/,
 use: 'url-loader?limit=1024
}

如果有多个参数,就用 ‘&' 连接起来。和http请求中的参数类似。正如前面介绍的,limit这个参数就是告诉url-loader,在文件小于多少个字节时,将文件编码并返回DataURL。此外url-loader还有一些用于file-loader的参数。我们知道,file-loader的作用是将文件复制到其他目录。file-loader提供了一系列参数允许我们自定义诸如输出文件、文件名规则、发布路径等特性的参数。下面介绍一下这些参数。

3.url-loader的参数

先看下配置好的代码:

module.exports = {
 // 入口文件路径,__dirname是根目录
 entry: __dirname + '/src/main.js',
 // 打包生成文件
 output: {
  path: __dirname + '/output',
  filename: 'main.js'
 },
 
 module: {
  rules: [
   {
    test: /\.css$/,
    use: ['style-loader', 'css-loader']
   },
   {
    test: /\.jpeg$/,
    use: 'url-loader?limit=1024&name=[path][name].[ext]&outputPath=img/&publicPath=output/',
   }
  ]
 }
}

这里涉及到了4个参数:limit、name、outputPath、publicPath。其中limit已经说明过。file-loader相关的是name、outputPath和publicPath。下面解释一下这3个参数

name表示输出的文件名规则,如果不添加这个参数,输出的就是默认值:文件哈希。加上[path]表示输出文件的相对路径与当前文件相对路径相同,加上[name].[ext]则表示输出文件的名字和扩展名与当前相同。加上[path]这个参数后,打包后文件中引用文件的路径也会加上这个相对路径。

outputPath表示输出文件路径前缀。图片经过url-loader打包都会打包到指定的输出文件夹下。但是我们可以指定图片在输出文件夹下的路径。比如outputPath=img/,图片被打包时,就会在输出文件夹下新建(如果没有)一个名为img的文件夹,把图片放到里面。

publicPath表示打包文件中引用文件的路径前缀,如果你的图片存放在CDN上,那么你上线时可以加上这个参数,值为CDN地址,这样就可以让项目上线后的资源引用路径指向CDN了。

4.安装url-loader

npm install --save-dev url-loader

5.demo

https://github.com/KIDFUCKER/webpack-demo.git

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

Javascript 相关文章推荐
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
Nov 20 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
jquery弹出框的用法示例(2)
Aug 26 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
jQuery实现textarea自动增长宽高的方法
Dec 18 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
Jul 26 Javascript
使用React实现轮播效果组件示例代码
Sep 05 Javascript
node.js操作mysql简单实例
May 25 Javascript
vue脚手架vue-cli的学习使用教程
Jun 06 Javascript
jQuery轮播图实例详解
Aug 15 jQuery
vue--vuex详解
Apr 15 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 #jQuery
Element输入框带历史查询记录的实现示例
Jan 15 #Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 #Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 #Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
Jan 15 #Javascript
微信 jssdk 签名错误invalid signature的解决方法
Jan 14 #Javascript
详解从react转职到vue开发的项目准备
Jan 14 #Javascript
You might like
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
学习PHP session的传递方式
2016/06/15 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Python笔记之facade模式
2019/11/20 Python
基于keras中的回调函数用法说明
2020/06/17 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
2014年母亲节寄语
2014/05/07 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电