学webpack之loader原理,让面试官跪下来唱征服

引言

什么是loader?

众所周知,webpack是个只能识别js和json文件的小笨蛋,所以就要有loader来转换,让文件能被webpack识别到,从而顺利打包,loader还能对资源进行优化,如压缩图片,代码分割等

常见的loader?
  • babel-loader:把新版的语法(如ES6)降级成低版本代码,让老不死的,IE等浏览器也能识别

  • css-loader:把css代码转成webpack能识别的js格式

  • style-loader: 把解析后的css注入到DOM中

基本上是见名知意,** -loder,就是处理 **的

loader的基本使用

直接一手module.rules,test来筛选要load的文件,如:

const path = require('path');
​
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.js$/, // 匹配所有 .js 文件exclude: /node_modules/, // 排除 node_modules 目录use: 'babel-loader' // 使用 babel-loader},{test: /\.css$/, // 匹配所有 .css 文件use: ['style-loader', 'css-loader'] // 使用 style-loader 和 css-loader}]}
};
单loader和多loader

单loader:

module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: 'babel-loader'}]
}

或者:

module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env']}}}]
}

多loader:

``

module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader']}]
}

或者

module: {rules: [{test: /\.css$/,use: [{loader: 'style-loader',options: {// style-loader 的选项}},{loader: 'css-loader',options: {// css-loader 的选项}}]}]
}

Loader 的工作流程

Webpack 的核心功能之一是将各种类型的资源转换为可以在浏览器中运行的模块。Loader 是实现这一功能的关键组件。以下是 Webpack 如何解析文件并将它们传递给 Loader 处理的详细工作流程:

1. 解析入口文件

Webpack 从配置的入口文件开始解析。入口文件通常是 JavaScript 文件,但也可以是其他类型的文件。

2. 依赖分析

Webpack 会分析入口文件及其依赖关系,构建一个依赖图(Dependency Graph)。对于每个模块,Webpack 会检查其 importrequire 语句,解析出依赖的模块。

3. 匹配 Loader

对于每个模块,Webpack 会根据 module.rules 中的规则匹配相应的 Loader。规则通常基于文件路径的正则表达式。

4. 应用 Loader

一旦匹配到相应的 Loader,Webpack 会按照配置的顺序应用这些 Loader。Loader 的执行顺序是从右到左,从下到上

5. 处理模块

每个 Loader 都会对模块进行处理,将其转换为新的模块。Loader 可以对模块进行各种操作,如转换、压缩、解析等。

6. 生成最终模块

所有 Loader 处理完成后,Webpack 会生成最终的模块,并将其添加到依赖图中。

7. 重复上述过程

Webpack 会重复上述过程,直到所有模块都被处理完毕。

8. 生成输出文件

最后,Webpack 会根据 output 配置生成输出文件,并将所有模块打包到输出文件中。

扩展:Loader 执行顺序的控制
1. 配置文件中的顺序

webpack.config.js 文件中,module.rules 数组中的规则是按顺序匹配的。Loader 的执行顺序是从右到左,从下到上。

例如:

module.exports = {module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader']}]}
};

在这个例子中,css-loader 会先执行,然后是 style-loader

2. 使用 enforce 属性

enforce 属性可以用来指定 Loader 的执行阶段。它可以设置为 'pre''post' 或默认(不设置)。

  • 'pre':高优先级,Loader 会先于普通 Loader 和 Inline Loader 执行。

  • 默认(不设置):普通优先级,Loader 会执行在 pre Loader 之后,Inline Loader 之前。

  • 'post':低优先级,Loader 会执行在所有其他 Loader 之后。

例如:

module.exports = {module: {rules: [{test: /\.js$/,enforce: 'pre',use: 'eslint-loader'},{test: /\.js$/,use: 'babel-loader'},{test: /\.js$/,enforce: 'post',use: 'some-post-loader'}]}
};

在这个例子中,执行顺序将是:

1.eslint-loader (enforce: 'pre')

2.babel-loader (普通 Loader)

3.some-post-loader (enforce: 'post')

3. 使用 Inline Loader

在代码中直接使用 Inline Loader 可以覆盖配置文件中的设置。语法是在 import 语句中使用 ! 来分隔不同的 Loader。

例如:

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

在这个例子中,我们使用了 style-loadercss-loader,并为 css-loader 传递了 modules 参数。

4.inline Loader 使用前缀

在 Inline Loader 中,我们可以使用特定的前缀来进一步控制 Loader 的执行:

  • !:禁用配置文件中的所有 普通Loader,除了inlineLoader只使用 带pre和post的。

  • !!:禁用所有 Loader,只使用 Inline Loader。

  • -!:禁用 pre 和普通 Loader,只使用 post Loader 和 Inline Loader。

Loader 的分类

在 Webpack 中,Loader 可以按执行方式分为同步 Loader 和异步 Loader:

  • 同步 Loader:同步 Loader 是通过 this.callback 函数或直接返回值完成数据的处理。大部分 Loader 都是同步的,适用于不需要异步操作的场景,比如简单的字符串转换。

  • 异步 Loader:异步 Loader 使用 this.async() 方法来通知 Webpack 处理是异步的,这样可以支持异步操作(例如读取文件、访问网络资源)。调用 this.async() 会返回一个 callback 函数,Loader 执行完毕后调用该函数传递处理结果。

  • raw loader:处理原始的二进制数据

raw loader 允许直接处理非文本数据,如图片或其他二进制文件。要将 Loader 设置为 raw 型, 可以在 Loader 函数中指定 this.raw = true,这样 Webpack 会将文件内容以 Buffer 形式传 递给 Loader,而非字符串。

示例:
module.exports = function (source) {if (this.raw) {// source 是 Buffer,可以处理二进制数据const transformedSource = Buffer.from(source).toString('base64');return `module.exports = "${transformedSource}"`;}
};
module.exports.raw = true; // 设置为 raw loader
  • pitching loader:理解 pitch 的概念和作用

Pitch 是 Loader 的一个特殊功能,用于控制 Loader 执行的顺序和中间的交互。通常,Loader 是按照配置的顺序依次执行,但通过 pitch 函数,可以改变 Loader 执行顺序或中断流程。

Pitch 的作用
  1. 提前处理:在 Loader 开始处理之前做一些预处理工作。

  2. 跳过后续 Loaderpitch 方法返回值时,会跳过当前 Loader 及其后的 Loader,直接将结果传递给前面的 Loader。

  3. 中断或优化加载流程:可以用于缓存、绕过 Loader 或添加额外的前置逻辑。

Pitch 示例
module.exports = function (source) {return source;
};
​
module.exports.pitch = function (remainingRequest, previousRequest, data) {if (/* 某个条件满足 */) {return `module.exports = "跳过其他 loader";`;}// 否则继续执行下一个 loader
};

在这个例子中,当 pitch 函数的条件满足时,会返回一个结果从而跳过当前及后续的所有 Loader,从而直接返回给 Webpack。

Loader 的实现原理

在 Webpack 中,Loader 是一个导出函数,通过该函数可以对输入的文件内容进行处理并输出。Loader 本质上是一个函数,接受输入内容并返回处理后的内容,最终让 Webpack 能够理解并打包各种文件类型。Loader 可以通过 module.exports 导出,在 Webpack 构建过程中会自动调用这个函数处理指定类型的文件。

module.exports = function(content, map, meta) 参数说明

module.exports 中导出的函数的主要参数有三个:

  1. content:文件的内容,这是 Loader 接收到的待处理的原始内容。对于文本文件,这通常是字符串;对于 raw 类型的 Loader,它可以是 Buffer(用于处理二进制文件)。

  2. map:可选参数,表示文件的 Source Map。当源文件已经包含 Source Map 时,Webpack 会将它作为 map 传入,以便 Loader 能在转换内容的同时,修改 Source Map。生成和维护 Source Map 可以帮助更好地调试代码。

  3. meta:可选参数,用于传递 Loader 之间的元数据。多个 Loader 可能需要共享或传递信息给下一个 Loader。该参数通常在复杂场景中使用,例如需要共享状态的 Loader。

总结

loader像是个翻译官,把各种各样的文件翻译成webpack看得懂的样子,实际上是个导出函数

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

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

相关文章

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递,交给路由器后 可不可以做到直接发送给目的主机呢?…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中,我们希望实现一个简单的游戏系统,其中玩家可以通过击中目标来获得分数,同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示,以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CTF压缩包破解神器bkcrack教程和详细使用过程

kali安装bkcrack教程和详细使用过程 1.bkcrack介绍:2.bkcrack功能:3.bkcrack安装:Linux-Kali下:测试:Windows下安装: 4.bkcrack的使用方法:4.1查看相关参数4.2恢复内部密钥从 zip 档案中加载数据…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下: 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施,传统的乡…

UI设计公司—兰亭妙微—提供轨道交通行业UI设计

蓝蓝设计工作室2008年开始,2011年正式成立北京兰亭妙微科技有限公司,主创清华团队,专注软件和互联网ui设计开发,擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI,一直在学习进步。交通行业UE UI解…

2-Ubuntu/Windows系统启动盘制作

学习目标: 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器,确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器,理解启动盘的使用场景和注意事项,…

Java项目管理与SSM框架介绍

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程,管理jar包,编译代码,完成测试,项目打包等等。Maven工具是基于POM(Project Object Model,项目对象模型)实现的。在Maven的管理下每…

CGAL生成简单形状

三角形 四边形 立方体 六面体 棱柱 锥体 二十面体 网格 Polyhedron _mesh;/**************三角形************/CGAL::make_triangle(K::Point_3(100, 0, 0), K::Point_3(0, 100, 0), K::Point_3(0, 0, 0), _mesh);CGAL::IO::write_polygon_mesh("F:/WORK/STL/triangle.stl…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分,图形显示有所变化,美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

提高后端接口性能的方法

个人bibilailai(不喜请跳过):前几天参加的部门技术分享会,同事分享了一个内容为“提高接口性能的常见技巧”,个人觉得很有用,所以想在这里分享给大家,希望对刚入职场不久的兄弟姐妹们有所帮助。…

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境: 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后,可以尝试使用 su 切换到 tang 用户,确保该用户可以正常使用&#…

NVR监测软件/设备EasyNVR多品牌NVR管理工具/设备对城市安全有哪些具体益处?

在智慧城市的建设中,各种先进的技术系统正发挥着越来越重要的作用。其中,NVR监测软件/设备EasyNVR作为一种高效的视频边缘计算网关,不仅能够实现视频数据的采集、编码和存储,还能与其他智慧城市系统进行深度集成,共同推…

【NOIP提高组】虫食算

【NOIP提高组】虫食算 C语言C 💐The Begin💐点点关注,收藏不迷路💐 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: 43#98…

Lobe Chat:你的私人AI助理

有一天,一位程序员对他的朋友说:‘我希望有一个助手,能像我一样聪明,但不会吃饭、喝水和请病假。’朋友回答说:‘这很简单,你只需要一个智能聊天助手!’于是,程序员便找到了 LobeCha…

【CAPL实战】LIN帧干扰的脚本实现

文章目录 1、帧头干扰响应linDisturbRespWithHeader1.1 函数功能1.2 参数说明1.3 代码实例1.4 执行结果 2、帧头干扰帧头linDisturbHeaderWithHeader2.1 函数功能2.2 参数说明2.3 代码实例 1、帧头干扰响应linDisturbRespWithHeader 1.1 函数功能 使用一个新的header帧头来干…

华为HarmonyOS打造开放、合规的广告生态 - 激励广告

场景介绍 激励广告是一种全屏幕的视频广告,用户可以选择点击观看,以换取相应奖励。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告,通过AdRequestPar…