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 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
javascript 事件查询综合 推荐收藏
Mar 10 Javascript
关于html+ashx开发中几个问题的解决方法
Jul 18 Javascript
jQuery1.6 使用方法一
Nov 23 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
jQuery实现判断控件是否显示的方法
Jan 11 Javascript
axios向后台传递数组作为参数的方法
Aug 11 Javascript
layui表格 返回的数据状态异常的解决方法
Sep 10 Javascript
javascript跳转与返回和刷新页面的实例代码
Nov 20 Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
JS前端模块化原理与实现方法详解
Mar 17 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
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
农历与西历对照
2006/09/06 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
9种python web 程序的部署方式小结
2014/06/30 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
利用python进行文件操作
2020/12/04 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
校园报刊亭的创业计划书
2014/01/02 职场文书
网络编辑岗位职责
2014/03/18 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
企业党员个人自我评价
2014/09/20 职场文书
安全检查汇报材料
2014/12/26 职场文书
荒岛余生观后感
2015/06/09 职场文书
监守自盗观后感
2015/06/10 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书