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 相关文章推荐
33种Javascript 表格排序控件收集
Dec 03 Javascript
使用jQuery简单实现模拟浏览器搜索功能
Dec 21 Javascript
深入探密Javascript数组方法
Jan 08 Javascript
canvas实现手机端用来上传用户头像的代码
Oct 20 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
JS开发中基本数据类型具体有哪几种
Oct 19 Javascript
vue-cli3 DllPlugin 提取公用库的方法
Apr 24 Javascript
vue实现行列转换的一种方法
Aug 06 Javascript
浅谈layui里的上传控件问题
Sep 26 Javascript
OpenLayers3加载常用控件使用方法详解
Sep 25 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
开发一个封装iframe的vue组件
Mar 29 Vue.js
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 各种应用乱码问题的解决方法
2010/05/09 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
Python基础入门之seed()方法的使用
2015/05/15 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
Python如何计算语句执行时间
2019/11/22 Python
实现Python与STM32通信方式
2019/12/18 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
技校教师求职简历的自我评价
2013/10/20 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
推荐信格式范文
2014/05/09 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
学术会议邀请函
2015/01/30 职场文书
无保留意见审计报告
2015/06/05 职场文书
工作证明书
2015/06/15 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
Nginx的gzip相关介绍
2022/05/11 Servers
windows系统安装配置nginx环境
2022/06/28 Servers