webpack-loader详解

一、loader的分类

1.pre:前置loader
2.normal:普通loader
3.inline:内联loader
4.post:后置loader

二、执行顺序

pre > normal > inline > post,相同类型的loader执行顺序为:从右到左,从下到上

module:{rules:[{enforce:"pre",  //通过这个参数来定义loader的类型,默认是normal类型test:/\.js/,loader:"loader"}]
}

内联loader不能用上面的方式定义,必须用下面的方式

// 多个loader用!分开,要给loader传参就必须用?后面接参数,就比如?module,module就是css-loader的参数
import style from "style-loader!css-loader?module!./style.css"

使用内联loader会遇到一个问题,就比如上面的代码使用了css-loader,可能在配置文件里面也配置了css-loader,这样就会造成重复,所以内联loader提供了添加前缀的方式来避免这种问题

  • 使用 ! 前缀,将禁用所有已配置的 normal loader(普通 loader)
import Styles from '!style-loader!css-loader?modules!./styles.css';
  • 使用 !! 前缀,将禁用所有已配置的 loader(preLoader, loader, postLoader)
import Styles from '!!style-loader!css-loader?modules!./styles.css';
  • 使用 -! 前缀,将禁用所有已配置的 preLoader 和 loader,但是不禁用 postLoaders
import Styles from '-!style-loader!css-loader?modules!./styles.css';

三、手写loader

1.定义同步testLoader.js文件

/***  content:文件内容*  map  SourceMap*  meta  别人loader传递的参数,必须是处理同一个文件的loader*/
module.exports = function (content, map, meta) {/***    callback参数*    第一个参数是报错信息,没有报错就是null,其余参数就是上面loader接收的参数* 	这种写法也叫同步loader,同步loader里面不能写异步操作*/this.callback(null, content, map, { whh: 1 });
};

2.定义异步testLoader.js文件

/***  content:文件内容*  map  SourceMap*  meta  别人loader传递的参数,必须是处理同一个文件的loader*/
module.exports = function (content, map, meta) {const callback = this.async();  //等同于await,有异步操作的时候,这样才能拿到值setTimeout(() => {callback(null, content, map, { whh: 1 });}, 1000);
};

3.定义raw loader

/***  content:文件内容*  map  SourceMap*  meta  别人loader传递的参数,必须是处理同一个文件的loader*/
module.exports = function(content,map,meta){//这里的content就变成二进制buffer数据了,可以用于处理图片等等媒体文件console.log(content);return content;   //不需要做太多操作的时候,就可以直接返回content,不需要使用callback
}
module.exports.raw = true;   //开启

4.定义picth loader

/***  content:文件内容*  map  SourceMap*  meta  别人loader传递的参数,必须是处理同一个文件的loader*  这个函数就是普通函数*/
module.exports = function (content, map, meta) {return content;
};
/*** {test: /\.js$/,use: ["loader1","loader2","loader3","loader4","loader5"],},假如有多个loader来处理js文件,每个loader都有定义pitch函数,那么他们的顺序是先从左到右执行loader里面的picth函数,然后再从右到左执行普通函数,pitch函数的return不是必需的,如果在执行picth函数途中,某个loader的pitch函数有return,那么整个picth执行会结束,然后从当前loader开始从右到左执行普通的函数举例说明,执行顺序为loader1里面的pitch,然后loader2里面的pitch,一直到loader5里面的pitch,然后再执行loader5里面的普通函数,一直到loader1里面的普通函数,整个流程就是loader的执行过程,但是如果执行到loader3里面的pitch,发现有return,那么就不会执行loader4和loader5里面的pitch函数和普通函数,会直接执行loader3的普通函数,然后loader2的普通函数,最后到loader1的普通函数,然后执行结束
*/
module.exports.pitch = function () {console.log("picth");return "result";
};

使用方法:

{test: /\.lth$/,loader: path.resolve(__dirname, "../loader/testLoader.js"),
},

还有很多很多API,就不详细说了,看官方文档或者其他人的博客吧
官方链接
这里主要说一下传参的api,这个还是很重要的

module.exports = function (content, map, meta) {const obj =  this.getOptions();  //通过这个来获取传递进来的参数console.log(obj);  //{ name: 'kobe', age: 24 }return content;
};
 {test: /\.lth$/,use: [{loader: path.resolve(__dirname, "../loader/testLoader.js"),options: {   //通过options传递给loadername: "kobe",age: 24,},},],},

loader的详解就到这里了,可以看着官方文档和百度试着自己写一个loader,下一篇再说plugin的详解了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM垃圾收集——概述

文章目录 1、什么是垃圾2、为什么需要垃圾收集3、如何进行垃圾收集3.1、早期垃圾收集3.2、Java垃圾收集机制 4、小结 垃圾收集(Garbage Collection,GC)并不是Java语言所独有的,早在1960年,Lisp语言中就已经开始使用内存的动态分配和垃圾收集技术。可见&a…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展,网络化的工作模式已经几乎覆盖到各个工作领域中的业务内,人们的日常生活也渐渐离不开互联网。因此,在当下全国各处的酒店都开始构建起了自己的网络预订系统。…

Spring Boot整合Spring Security

Spring Boot 专栏:Spring Boot 从零单排 Spring Cloud 专栏:Spring Cloud 从零单排 GitHub:SpringBootDemo Gitee:SpringBootDemo Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术…

Netty学习——源码篇6 Pipeline设计原理

1 Pipeline设计原理 在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应,它们的组成关系如下图: 通过上图可以看到,一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的…

【笔记】深入理解JVM机制

🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 JVM 运⾏流程图 JVM 中内存区域划分 方法区 / 元数据区 堆 栈 程序计数器 本地方法栈 内存区域总结 JVM 中类加载过程 …

C++ STL- list 的使用以及练习

目录 0.引言 1. list 介绍 2. list 使用 2.1 构造函数 2.2 list iterator 的使用 3 list capacity 4. list element access 5. list modifiers 6. list 迭代器失效 7. list 与vector 对vector 8. OJ 题讲解 删除链表的倒数第 N 个节点: 0.引言 …

Jetson AGX ORIN 配置 FGVC-PIM 神经网络(包含 arm64 下面 torch 和 torchvision 配置内容)

Jetson AGX ORIN 配置 FGVC-PIM 神经网络 文章目录 Jetson AGX ORIN 配置 FGVC-PIM 神经网络配置 ORIN 环境创建 FGVC-PIM 虚拟环境安装 PyTorch安装 torchvision安装其他依赖包 配置 ORIN 环境 首先先配置 ORIN 的环境,可以参考这个链接: Jetson AGX …

Go第三方框架--gin框架(一)

序言 Gin框架作为go语言使用最多的web框架,以其快速的响应速度和对复杂http路由配置的支持受到程序员和媛们的喜爱,几乎统治了web市场。但作为一名合格的程序员,要知其然更要知其所以然,不然八股文背的也没有啥意思。本着这个原则…

JavaScript中的Lexical Environment

概要 本文主要介绍JavaScript中的一个重要概念Lexical Environment,它可以帮助我们解释我们为什么可以通过嵌套方法,共享数据,以及为什么可以在函数中定义一个和全局变量同名的变量,并且不会影响到全局变量。 基本分析 基本概念…

28377s使用的记录和注意点(1)

28377s使用的记录和注意点(1)_dsp28377设置复位不清除ram区域-CSDN博客

SUB-1G替代CMT2380F32 SOC芯片DP4306F 32 位ARM Cortex-M0+内核应用无线遥控工控设备智能家居

DP4306F是一款高性能低功耗的单片集成收发机,集成MO核MCU,工作频率可覆盖200MHiz^ 1000MHz。 支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选…

如何使用Python进行网络安全与密码学【第149篇—密码学】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 用Python进行网络安全与密码学:技术实践指南 随着互联网的普及,网络…

几个常用的AI工具

人工智能大模型的出现对人类社会产生了深远的影响,这些影响既包括积极的方面,也包括一些潜在的挑战: 1. **提高效率**:AI大模型能够快速处理大量数据,提高工作效率,尤其在数据分析、自然语言处理等领域。 2. **辅助决…

面向对象【枚举类】

文章目录 枚举类定义枚举类enum 方式定义的要求和特点 enum 中常用方法实现接口的枚举类 枚举类 枚举类是一种特殊的类,它用于定义一组固定数量的常量。枚举类在实际开发中非常有用,因为它们可以增加代码的可读性和可维护性。本文将介绍Java枚举类的定义…

spring maven项目 实时接口请求次数及时间发送到grafana监控_亲测成功

spring maven项目 实时接口请求次数及时间发送到grafana监控_亲测成功 说明: spring项目使用aop方式拿到请求接口uri,算出从请求到响应的耗时, 然后使用statsd包发送udp数据给grafana去展示. 完全不影响代码性能和稳定性,因为使用udp协议发送,就算grafana那边挂了,也不影响项…

【C++】6-2 交换函数2 分数 10

6-2 交换函数2 分数 10 全屏浏览 切换布局 作者 刘利 单位 惠州学院 根据题目需求&#xff0c;编写一个交换函数Swap。 裁判测试程序样例&#xff1a; #include <iostream> using namespace std; class pen{private:string brand;string color;double price;publi…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…

【Java程序设计】【C00370】基于(JavaWeb)Springboot的公司进存销管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

OJ : 1090 :整数幂(多实例测试)

题目描述 求A^B的最后三位数表示的整数&#xff08;1<A,B<1000&#xff09; 输入 n个测试实例&#xff0c;每个实例给出两个正整数A,B 输出 输出A^B的最后三位&#xff08;没有前导0&#xff09; 样例输入 2 2 3 12 6 样例输出 8 984 思路&#xff1a; 这个题…

c# 更改网卡的默认网关

前言: 通过程序更改网卡网关 公司内有多个网络出口,其中一个为固定IP的 带宽只有60M用于应用系统访问, 一个是一条千兆带宽的ADSL,但是只有电信内网IP。做开发调试尤其是企业微信接口涉及到接口白名单IP&#xff0c;需要走固定IP&#xff0c;而日常一些下载当然我选择用千兆带宽…