返回顶部
首页 > 资讯 > 前端开发 > JavaScript >webpack自定义loader全面详解
  • 197
分享到

webpack自定义loader全面详解

webpack自定义loaderwebpackloader 2023-01-04 12:01:50 197人浏览 安东尼
摘要

目录什么是loader?loader类型如何指定loader类型如何禁用一些loader?开发自定义两个loader,并分别实现url-loader和file-loaderfile-

什么是loader?

因为webpack不识别非js结尾的文件,所以需要借助loader来告诉WEBpack如何对这些文件进行处理和输出的 loader都有哪些类型

loader类型

loader在webpack 中有四种loader:

  • pre(前置)
  • nORMal(普通)
  • inline(行内)
  • post(后置)

loader的执行顺序:pre>normal>inline>loader

如何指定loader类型

在webpack中通过Rule.enforce来指定loader的类型

{
test: /\.less$/,
use: 'less-loader',
enforce: 'pre'
}

如果没有enforce就会指定为普通的loader

如何禁用一些loader?

比如说一个eslint-loader,有的的开发者可能使用不了,但是不能干扰到其他同事,可以选择直接禁用它

require('!inline-loader!./a.js') 使用 ! 禁用配置文件中的普通loader

require('-!inline-loader!./a.js') 使用-!禁用所有的前置和普通loader

require('!!inline-loader!./a.js') 使用!! 禁用所有的后置和普通loader

下面开始直奔主题,开始说说url-loader和file-loader

为什么要用url-loader和file-loader?

url-loader和file-loader在webpack中是最常用的两个loaderl了,首先这两个loader存在一个相同点,上面已经提到webpack不能处理像CSS,scss,less,jpg,svg或者是其他文件格式的资源,这个时候就需要借助这两个loader其中一个去处理。

下面说一下这两个loader的区别

相同点:这两个loader都是用来处理在webpack编译的时候不能识别的文件格式

不同点:url-loader会在特定的条件下将资源输出为base64编码格式,为什么说在特定条件下,用过此loader的人都知道有一个limit的配置,通过这个配置来识别文件以哪种格式输出,并且在他内部也引用了file-loader,file-loader就是讲webpack不能识别的文件进行编译,并输出到指定的目录,url-loader就相当于对file-loader进行了二次封装,所以现在还是url-loader用的比较多一些。

开发自定义两个loader,并分别实现url-loader和file-loader

在编写源码之前需要安装三个依赖,分别是:

  • loader-utils loader的工具
  • mime 文件类型匹配
  • schema-utils 验证loader参数

file-loader

  • 创建文件loader/file-loader.js
const LoaderUtils = require('loader-utils')
module.exports = function(content,map,mate){
   //   1. 获取参数
   var options = loaderUtils.getOptions(this) || {};    
   //   2. 是否使用ESM导出 
   const esModule = typeof options.esModule !== 'undefined' ? options.esModule : true; 
   //   3. 根据文件生成带hash值文件名
   const publicPath = LoaderUtils.interpolateName(this,"[hash].[ext][query]",content);
   //   4. 将文件输出出去
   this.emitFile(publicPath,content)
   //   5. export 文件名
   return `${esModule ? 'export default' : 'module.exports ='}${publicPath}`;  
}
// 需要处理 文件 ,图片等文件格式都是 buffer格式的 需要使用rawloader才能处理
module.exports.raw = true;

url-loader

  • 创建文件loader/option.JSON
{
    "type":"object",
    "properties":{
         "limit":{
             "type":["string","number"]
         },
         "mimeType":{
              "type":"string"
         },
         "esModule":{
            "type":"boolean"
       } 
    }
}
  • 创建文件loader/url-loader.js
var loaderUtils = require("loader-utils");
var mime = require("mime");
var validate = require("schema-utils"); 
var schema = require('./option.json');
function shouldTransform(limit, size){
	if (typeof limit === 'boolean') {
	  return limit;
	}
	if (typeof limit === 'string') {
	  return size <= parseInt(limit, 10);
	}
	if (typeof limit === 'number') {
	  return size <= limit;
	}
	return true;
  }
module.exports = function(content) {  
	// 1. 获取参数
	var query = loaderUtils.getOptions(this) || {};
	// 2. 验证参数 - 当出现错误的时候会自动抛出错误 
	validate(schema, query,{name:'url-loader'});
	// 3. 文件大小限制
	var limit = (this.options && this.options.url && this.options.url.dataUrlLimit) || 0;
	// 2.0+版本以后新增的esModuleapi
	let esModule = query.esModule 
	// 类型
	var mimetype = query.mimetype || query.minetype || mime.lookup(this.resourcePath);
	// 通过文件大小
	if(shouldTransform(query.limit,content.length)){
	// 如果比较文件小于limit 以base64的形式去展示 
		return `${esModule ? 'export default' : 'module.exports ='}` + JSON.stringify("data:" + (mimetype ? mimetype + ";" : "") + "base64," + content.toString("base64"));
	} else {
    // 这里引入我们自己的file-loader 
	// 如果比较文件大于limit,以url的形式展示
		var fileLoader = require("./file-loader.js");
		return fileLoader.call(this, content);
	}
}
module.exports.raw = true;

如何测试使用

在loader统计目录下创建webpack.config.js,只需要验证url-loader就可以了,因为内部已经有file-loader的导入

// webpack.config.js 中
{
oneOf:[
    {
        test:/\.js$/,
        use:[
        {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: './loader/url-loader.js', 
            exclude: [resolve('src/icons')],
            options: {
            limit: 10000,
            // 名称
            name: utils.assetsPath('img/[name].[hash:7].[ext]')
            }
        },
        ]
    }
]
},

本篇文章主要介绍loader的基础知识和如何去开发自定义loader,并介绍了两个常用的loaderurl-loaderfile-loader,也进行了基本的实现,通过本片文章希望你能对webpack的loader的使用以及开发有一个基本的认识,更多关于webpack自定义loader的资料请关注编程网其它相关文章!

--结束END--

本文标题: webpack自定义loader全面详解

本文链接: https://lsjlt.com/news/176683.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • webpack自定义loader全面详解
    目录什么是loaderloader类型如何指定loader类型如何禁用一些loader?开发自定义两个loader,并分别实现url-loader和file-loaderfile-l...
    99+
    2023-01-04
    webpack自定义loader webpack loader
  • webpack loader配置全流程详解
    前言主要目的为稍微梳理从配置到装载的流程。另外详解当然要加点源码提升格调(本人菜鸟,有错还请友善指正)被的WebPack打包的文件,都被转化为一个模块,比如import './xxx/x.jpg'或require('...
    99+
    2023-06-03
  • 如何自定义配置Angular CLI下的Webpack和loader处理
    今天就跟大家聊聊有关如何自定义配置Angular CLI下的Webpack和loader处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 Ang...
    99+
    2024-04-02
  • hadoop全面解读自定义分区
    分区概念 分区这个词对很多同学来说并不陌生,比如Java很多中间件中,像kafka的分区,mysql的分区表等,分区存在的意义在于将数据按照业务规则进行合理的划分,方便后续对各个分区...
    99+
    2024-04-02
  • 基于自定义Toast全面解析
    Toast一般用来显示一行文字,用法比较固定:Toast.makeText(Context context,String message,int duration);...
    99+
    2023-05-30
    自定义 toast st
  • 详解Flutter如何完全自定义TabBar
    目录前言实现过程完整代码总结前言 在App中TabBar形式交互是非常常见的,但是系统提供的的样式大多数又不能满足我们产品和UI的想法,这篇就记录下在Flutter中我在实现自定义T...
    99+
    2024-04-02
  • 详解Android自定义View--自定义柱状图
    绪论 转眼间,2016伴随着互联网寒冬和帝都的雾霾马上就过去了,不知道大家今年一整年过得怎么样?最近票圈被各个城市的雾霾刷屏,内心难免会动荡,庆幸自己早出来一年,也担忧着自己的...
    99+
    2022-06-06
    view 柱状图 Android
  • Android 自定义SurfaceView详解
           本文简单讨论以后Android游戏引擎模板的架构问题。在Android游戏开发教程之二:View类与S...
    99+
    2022-06-06
    surfaceview Android
  • Android自定义View详解
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 很多的Android入门程序猿来说对于An...
    99+
    2022-06-06
    view Android
  • 详解React自定义Hook
    目录前言如何自定义 Hooks组件之间共享逻辑自定义 Hooks 允许你共享有状态逻辑,而不是状态本身分类功能型 HooksuseWindowWidthuseLocalStorage...
    99+
    2023-05-17
    React自定义Hook React Hook
  • JavaSpringBoot自定义starter详解
    目录一、什么是SpringBoot starter机制二、为什么要自定义starter ?三、什么时候需要创建自定义starter?四、自定义starter的开发流程(案例...
    99+
    2024-04-02
  • C语言自定义类型全面系统理解
    目录一、结构体1.结构体的声明局部结构体变量全局结构体变量2.特殊声明3.结构体的自引用4.结构体变量的初始化5.结构体内存对齐 6.修改默认对齐数7.结构体传参传址调用原因:二、位...
    99+
    2024-04-02
  • Java自定义注解的详解
    Java自定义注解Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解。Java1.5引入了注解,当前许多java框架中大量使用...
    99+
    2023-05-31
    java 自定义 注解
  • Android自定义View-Paint详解
    Paint的使用 setStyle Paint.Style.FILL:填充模式 Paint.Style.STROKE:画线模式 Paint.Style.FI...
    99+
    2024-04-02
  • SpringBoot之自定义Banner详解
    1、在线生成banner网站 https://www.bootschool.net/ascii http://www.network-science.de/ascii/ http...
    99+
    2024-04-02
  • JAVA自定义注解详情
    目录原理:元注解:@Retention参数讲解:案例:给一个类的String属性设置默认值总结原理: 注解的本质是继承Annotation的特殊接口,其具体实现类是Java运行时生成...
    99+
    2024-04-02
  • Vue自定义指令详解
    目录Vue自定义指令自定义指令钩子函数输出相关属性运用例子总结Vue自定义指令 自定义指令 注册一个全局指令v-focus,该指令的功能是在页面加载时元素获得焦点 <!DO...
    99+
    2024-04-02
  • Notification自定义界面
    前言之前在做一个手机的播放器,需要做到在通知栏显示控制播放的界面,如下:这是让服务在前台运行就可以实现的(可以参考我的前一篇文章Service在前台运行),今天我们就要实现Notification的自定义界面,当然就不实现如上图所示的了,而...
    99+
    2023-05-30
  • SpringBoot自定义注解之实现AOP切面日志详解
    通过自定义注解的方式(如:@SysLog(obj = "操作对象", text = "操作内容"),在 SpringBoot 中来实现 AOP...
    99+
    2024-04-02
  • java自定义切面增强方式(关于自定义注解aop)
    目录java自定义切面增强切面、自定义注解的使用AOP简介AOP定义注解简介元素和组成元注解总结java自定义切面增强 写代码时会遇到一些有些重复机械的工作, 这个时候就可以运用切面...
    99+
    2023-05-14
    java自定义切面增强 自定义注解aop java切面
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作