前端工程化之:webpack1-8(loader)

一、loader

 webpack 做的事情,仅仅是分析出各种模块的依赖关系,然后形成资源列表,最终打包生成到指定的文件中。
更多的功能需要借助 webpack loaders (加载器) webpack plugins (插件)完成。

 webpack loader loader 本质上是一个函数,它的作用是 webpack 打包过程中将某个源码字符串转换成另一个源码字符串返回

 loader 函数的位置在编译时,处于读取文件内容之后 AST 抽象语法树分析之前语法分析过程中, loader 函数将源代码转化为新代码后,进行语法树分析。 loader 函数将在模块解析的过程中被调用,以得到最终的源码。

1.全流程:

2. chunk 中解析模块的流程:

3. chunk 中解析模块的更详细流程:

4.处理 loaders 流程:

 

 5. loaders 配置:

 (1)完整配置

module.exports = {module: { //针对模块的配置,目前版本只有两个配置,rules、noParserules: [ //模块匹配规则,可以存在多个规则{ //每个规则是一个对象test: /\.js$/, //匹配的模块正则use: [ //匹配到后应用的规则模块{  //其中一个规则loader: "模块路径", //loader模块的路径,该字符串会被放置到require中options: { //向对应loader传递的额外参数changeVar: "变量"}}]}]}
}

读取 loader 中传过来的参数,在模块路径下的 js 文件中引入 loader-utils 插件,插件下载命令:

npm i -D loader-utils

 ./loaders/test-loader 文件中,通过引入 loader-utils 插件的 getOptions(this) 获取到参数:

var loaderUtils = require("loader-utils");module.exports = function (sourceCode) {// sourceCode : 变量 a = 1;console.log("test-loader运行了");console.log(this); // this 为 loader 的 context上下文,接收参数var options = loaderUtils.getOptions(this); // 拿到loaders配置中的参数console.log("options", options);var reg = new RegExp(options.changeVar, "g"); // 通过正则匹配sourceCode = sourceCode.replace(reg, "var"); // 将匹配的参数都替换为varreturn sourceCode;
};

 loaders 也可通过在模块路径上以 query 的形式传递,读取参数方法与上方一致:

loader: "./loaders/test-loader?changeVar=未知数", // 加载器的路径

(2)简化配置

 loaders 的参数配置中也可以是数组:

module.exports = {mode: "development",module: {rules: [{test: /index\.js$/, //匹配的模块正则use: ["模块路径1", "模块路径2"]//loader模块的路径,该字符串会被放置到require中}]}
}

(3) loader 匹配规则

从上到下匹配,将每次匹配得到的数组都放到一个空数组内,然后从后往前使用,一层一层处理,最后处理到 loader1

 webpack.config.js :

module.exports = {mode: "development",module: {rules: [{test: /index\.js$/, //正则表达式,匹配模块的路径use: ["./loaders/loader1", "./loaders/loader2"] //匹配到了之后,使用哪些加载器}, //规则1{test: /\.js$/, //正则表达式,匹配模块的路径use: ["./loaders/loader3", "./loaders/loader4"] //匹配到了之后,使用哪些加载器} //规则2], //模块的匹配规则}
}

 loader.js : 

//loader1.js
module.exports = function(sourceCode){console.log("loader1");return sourceCode;
}//loader2.js
module.exports = function(sourceCode){console.log("loader2");return sourceCode;
}//loader3.js
module.exports = function(sourceCode){console.log("loader3");return sourceCode;
}//loader4.js
module.exports = function(sourceCode){console.log("loader4");return sourceCode;
}

 最后将 loader4 结果返回给 loader3 ,再返回给 loader2 ,最后 loader1 。输出结果为:

loader4
loader3
loader2
loader1

这里如果 index.js 依赖 a.js 
 a.js 又匹配到 loader3 loader4 

loader4
loader3
loader2
loader1
loader4
loader3

需要注意的是:由于要对打包文件进行 loader 规则处理,所以要在打包过程中读取 loader 文件,即在 node 环境中,所以这里使用 CommonJs

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

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

相关文章

数据结构哈希表(散列) 之Hash

声明: 此文章仅限于记录学习之用 , 受限于自身水平和理解能力 , 因此结论可能是不正确的. 如果您需要学习,建议参考其他文章 看了下网上一些大佬的教程, 写的云山雾绕的. 简单总结下吧. 以言简意赅为主. 介绍下hash hash 就是把任意输入通过算法生成一个int值. 这个值就是放…

如何使用 Supabase Auth 在您的应用程序中设置身份验证

在本文中,您将学习基本的关键概念,这些概念将帮助您掌握身份验证和授权的工作原理。 您将首先了解什么是身份验证和授权,然后了解如何使用 Supabase auth 在应用程序中实现身份验证。 (本文内容参考:java567.com&…

Spark入门01-Spark简介

1 Spark是什么 Spark是用于大规模数据处理的统一分析引擎。对任意类型的数据进行自定义计算。 可以计算:结构化、非结构化,半结构化的数据结构,支持使用Python,Java,Scala、Sql语言开发应用程序计算数据。 计算框架&a…

微服务—Docker

目录 初识Docker Docker与虚拟机的区别 镜像与容器 Docker架构 常见Docker命令 镜像命令 容器命令 数据卷挂载 直接挂载 初识Docker 在项目部署的过程中,如果出现大型项目组件较多,运行环境也较为复杂的情况,部署时会碰到一些问题&…

【力扣经典面试题】189. 轮转数组

题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 …

探索Viper-适用于GoLang的完整配置解决方案

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 对于现代应用程序,尤其大中型的项目来说,在程序启动和运行时,往…

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题:为什么会有docker出现? 假定您在开发一个项目,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

【Linux】yum与vim命令详解

💗个人主页💗 ⭐个人专栏——Linux学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读1. yum命令1.1 基本使用1.2 注意事项1.3 lrzsz软件包示例 2. vim命令2.1 vim的基本概念2.2 vim配置2.3 vim的基本操作2.3…

JSON巨匠:FastJSON的序列化解析

Fastjson 简介 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。 Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。 Fastjson 源码地址:https://…

【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.CAPL实现4.1.函数展示4.2.全量报文展示5.效果1.概述 本章主要介绍使用CAPL和Panel在按下按钮时发送周期性CAN报文。 本章主要在“【零基础学习CAPL】——CAN报文的发送(配合P…

面对近期行情大起大落的伦敦银需要关注什么?

近期经常有听到投资者抱怨说,伦敦银价格没有明显趋势,很难做。确实,我们从日线图看,金价处于一个比较宽幅的横盘区间当中,近期的行情也是大涨大跌。投资者认为,面对大起大落的行情无从下手。下面我们就来讨…

第十篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:深度解读鸿蒙全场景适配

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例系列 短博文目录前言一、鸿蒙全场景适配实现介绍二、统一核心示例代码三、设备驱动框架示例代码四、统一界面框架示例代码五、自适应布局示例代码六、分布式能力示例代码七、跨平台开发示例代码八、设备能力开放示例…