手写webpack的loader

一、概念

帮助webpack将不同类型的文件转换为webpack可识别的模块。

二、Loader执行顺序

分类

  • pre:前置loader
  • normal:普通loader
  • inline:内联loader
  • post:后置loader

执行顺序

  • 4类loader的执行顺序为per>normal>inline>post
  • 相同优先级的loader执行顺序为:从右到左,从下到上。
    例如:
// 此时loader执行顺序:loader3 - loader2 - loader1
module: {rules: [{test: /\.js$/,loader: "loader1",},{test: /\.js$/,loader: "loader2",},{test: /\.js$/,loader: "loader3",},],
},
// 此时loader执行顺序:loader1 - loader2 - loader3
module: {rules: [{enforce: "pre",test: /\.js$/,loader: "loader1",},{// 没有enforce就是normaltest: /\.js$/,loader: "loader2",},{enforce: "post",test: /\.js$/,loader: "loader3",},],
},

使用Loader 的方式

  • 配置方式:在 webpack.config.js 文件中指定 loader。(pre、normal、post loader)
  • 内联方式:在每个 import 语句中显式指定 loader。(inline loader)

inline Loader

用法:import Styles from ‘style-loader!css-loader?modules!./styles.css’;

含义:使用 css-loader 和 style-loader 处理 styles.css 文件通过 ! 将资源中的 loader 分开
inline loader 可以通过添加不同前缀,跳过其他类型 loader。! 跳过 normal loader。

import Styles from '!style-loader!css-loader?modules!./styles.css';

-! 跳过 pre 和 normal loader。

import Styles from '-!style-loader!css-loader?modules!./styles.css';

!! 跳过 pre、 normal 和 post loader。

import Styles from '!!style-loader!css-loader?modules!./styles.css';

三、开发一个Loader

最简单的Loader

//loader/loader1.js
module.exports = function (content){console.log(content)return content;
}

他接受要处理的源码作为参数,输出转换后的js代码

Loader接受的参数

  • content 源文件的内容
  • map sourceMap数据
  • meta 数据可以是任何内容

Loader分类

  1. 同步Loader

module.exports = function (content ,map ,meta) {/* 第一个参数:err代表是否有错误第二个参数:content处理后的内容第三个参数:sorce-map继续传递sourcemap 第四个参数:meta给下一个loader传递参数*///相比于普通return方式这种写法可以传递更多参数,不中断loader执行。//return content this.callback(null,content,map,meta)
}
  1. 异步Loader

由于同步计算过于耗时,在 Node.js 这样的单线程环境下进行此操作并不是好的方案,我们建议尽可能地使你的 loader 异步化。但如果计算量很小,同步 loader 也是可以的。

module.exports = function (content, map, meta) {const callback = this.async();// 进行异步操作setTimeout(() => {callback(null, result, map, meta);}, 1000);
};
  1. Raw Loader

默认情况下,资源文件会被转化为 UTF-8 字符串,然后传给 loader。通过设置 raw 为 true,loader 可以接收原始的 Buffer

module.exports = function (content) {// content是一个Buffer数据return content;
};
module.exports.raw = true; // 开启 Raw Loader
  1. Pitching Loader

webpack 会先从左到右执行 loader 链中的每个 loader 上的 pitch 方法(如果有),然后再从右到左执行 loader 链中的每个 loader 上的普通 loader 方法。在这个过程中如果任何 pitch 有返回值,则 loader 链被阻断。webpack 会跳过后面所有的的 pitch 和 loader,直接进入上一个 loader 。

module.exports = function (content) {return content;
};
module.exports.pitch = function (remainingRequest, precedingRequest, data) {console.log("do somethings");
};

在这里插入图片描述

手写banner-loader

作用:给代码添加文本注释包括作者、日期

//loader/banner-loader.js
const schema =  require("./schema.json");
module.exports  = function (content,map,meta){//获取Loader的options,同时对options做校验//schema 是options的校验规则。const options = this.getOptions(schema);const date = (new Date()).toLocaleString()const prefix = `/* Author ${options.author}Date ${date}*/`return `${prefix} \n ${content}`
}

下面是schema.json文件

{"type":"object","porperties":{"author":{"type":"string"}},"addtionalProperties":false
}

在webpack.config.js中配置

//...省略module: {rules: [{test:/\.js$/,loader:'./loader/banner-loader',options:{author:'老王'}}]},

在dist压缩文件main.js中

/***/ "./src/main.js":
/*!*********************!*\!*** ./src/main.js ***!\*********************/
/***/ (() => {eval("\n      /* \n        Author 老王\n        Date 2024/1/13 14:32:11\n      */\n     \n console.log('hello main')\n\n//# sourceURL=webpack:///./src/main.js?");/***/ })/******/ 	});
/************************************************************************/

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

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

相关文章

极简Oracle 11g Release 2 (11.2.0.1.0)

注意:此法无法安装oracle11g(11.2.0.4),会报如下错: [FATAL] [INS-10105] The given response file /assets/db_install.rsp is not valid. 一、下载解压ORACLE安装包。 从 oracle 官网 下载所需要的安装包,这里我们以 oracle 11…

人声处理用什么软件好 FL Studio 怎么修人声 人声处理软件 人声处理步骤

一、人声处理用什么软件好 现在人声处理软件还是非常多的,有专门的人声处理软件,也有具备人声处理功能的编曲软件。专门人声处理的软件操作比较简单,但是处理后的人声在使用的时候可能还需要进行再处理,这会比较麻烦。具备人声处…

Debian12 安装jenkins 公钥配置

jenkins公钥配置 参考:Debian Jenkins 软件包 这是 Jenkins 的 Debian 软件包存储库,用于自动安装和升级。 要使用此存储库,请先将密钥添加到您的系统(对于每周发布行): sudo wget -O /usr/share/keyring…

命令行(无图形界面)登录dlut-lingshui

1 登录原理 利用python的requests库向校园网认证服务器发送认证请求。 2 登录步骤 获取校园网认证界面的用户名和密码。用户名是自己学号;密码由网页加密,需要一台有图形界面的电脑辅助获取,获取方法见下一节。把获取到的用户名和密码填入…

web前端算法简介之链表

链表 链表 VS 数组链表类型链表基本操作 创建链表:插入操作:删除操作:查找操作:显示/打印链表:反转链表:合并两个有序链表:链表基本操作示例 JavaScript中,instanceof环形链表 判断…

宝塔面板使用phpMyAdmin 502 Bad Gateway

第一步软件商店安装PHP 第二步设置phpMyAdmin,选择PHP版本 – 解决

[Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)

上一节讲解了K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群),这里来看看K8s使用Helm部署mysql集群(主从数据库集群) 一.Helm 搭建mysql集群 1.安装mysql不使用persistence(无本地存储) 无本地存储:当重启的时候,数据库消失 (1).打开官网的应用中心 打开应用中…

解决Spss没有创建虚拟变量的选项的问题

这个是今天用spss想创建虚拟变量然后发现我的spss没有。 然后能怎么办我就百度呗, 说是在扩展里连接扩展中心 天哪,谁能连上,我连不上 于是就找到了从github上下载到本地,然后安装到spss中 目录 解决方法 点击code 再点击D…

操作系统详解(5)——信号(Signal)

系列文章: 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 文章目录 概述信号的种类Hardware EventsSoftware Events 信号的原理信号…

小程序开发公司哪家好?哪家最好?

小程序具有轻量、聚焦、快捷等特点,这有别于 web 端类和移动端 app 类产品。 小程序的第一印象非常关键,因此对于首页设计,关键要加强注意力表达,给予用户尽可能直观的信息感知,加快建立其对于业务价值的兴趣&#xf…

强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

Ubuntu 在线Swap扩容

1. 查看本机swap空间 free -h 2. 找一个较大的高速盘,创建swap的空间 mkdir /swap cd /swap sudo dd if/dev/zero ofswapfile bs50M count1k3.建swapfile,大小为bs*count 50M * 1k 50G 4.标记为Swap文件,让系统能识别交换文件。 sudo mk…

vue3hooks的使用

在 Vue 3 中,hooks 是用于封装组件逻辑的方法,类似于 Vue 2 中的 mixins。 使用 Hooks 可以提高代码的可维护性、可读性、可复用性和可测试性,降低代码之间的耦合度,使得组件的状态更加可控和可预测。 要使用 hooks,…

【JavaSE语法】图书管理系统实现详解

图片出处:The worlds biggest drone photo and video sharing platform | SkyPixel.com 导言 在学完JavaSE语法后,我们就可以去尝试写一个简单的图书管理系统来进一步提升我们面对对象编程的思想。在该系统中会涉及到数组,接口,封…

谷粒商城项目|es的应用场景及常见问题

es是什么 es多被用于搜索聚合分析引擎 是分布式的可以高性能查询的引擎 es应用场景 为什么不用MYSQL而用es es将数据存在内存中且可以分布式的存储数据 商品上架 商品在es中的保存 1.在es中建立索引 spu sku spu sku保存在一起防止分布查询 为了防止对象数组扁平化&#xff…

Unity摇杆+键鼠控制位移、旋转

1、位移 首先我们找到两张图片,一个大圆一个小圆,像这样: 结构是这样的: 然后,新建一个场景,用胶囊去做玩家,摄像机在胶囊下,并且在场景中放两个cube作为参照物 像这样搭好后&#…

探索商超货架场景目标检测性能,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建商超货架场景下亨氏米粉食品种类检测识别系统

在前面的系列博文中,我们陆续应用实践开发了很多有趣的项目,但是在密集排布场景下如商超购物场所内货架上货物种类目标检测模型的开发我们则少有涉及,正值周末,本文的主要目的就是想要实践构建这一场景下的目标检测模型&#xff0…

FPGA之初探

FPGA的构成 基本逻辑单元CLB CLB是FPGA的基本逻辑单元, 一个 CLB 包括了 2 个 Slices,所以知道Slices的数量就可以知道FPGA的“大概”逻辑资源容量了。一个 Slice 等于 4 个6输入LUT8个触发器(flip-flop)算数运算逻辑,每个 Slice 的 4 个触发…

AI与编程学习

在C语言中,指针通常与字符数组或字符串打交道时会涉及到ASCII码的转换,而不是用于表现多位数的第一位。48这个值对应的是ASCII码表中数字字符0的编码。 如果你有一个表示多位数的字符数组,例如: c char number[] "1234&qu…

【DC快速上手教程--1 Setup the DC】

DC快速上手教程--1 Setup the DC 0 Intro1 DC Demo 本篇系列教程介绍总结DC Flow,为了不涉密,在这里以DC labs为Demo做一个入门的介绍;目标:用起来EDA 工具是最基础也是最简单的;重点是如何去分析报告,依据…