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

news2024/11/17 5:48:45

一、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、noParse
        rules: [ //模块匹配规则,可以存在多个规则
            { //每个规则是一个对象
                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"); // 将匹配的参数都替换为var
  return 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.coloradmin.cn/o/1429084.html

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

相关文章

【Java开发岗面试】八股文—微服务、消息中间件

声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…

python 基础知识点(蓝桥杯python科目个人复习计划32)

今日复习内容:基础算法中的位运算 1.简介 位运算就是对二进制进行操作的运算方式,分为与运算,或运算,异或运算,取反,左移和右移。 (1)与运算 xyx&y000010100111 (2)或运算 …

OpenHarmony—Hap包签名工具

概述 为了保证OpenHarmony应用的完整性和来源可靠,在应用构建时需要对应用进行签名。经过签名的应用才能在真机设备上安装、运行、和调试。developtools_hapsigner仓 提供了签名工具的源码,包含密钥对生成、CSR文件生成、证书生成、Profile文件签名、Ha…

【安装指南】maven下载、安装与配置详细教程

🌼一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的,用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念: POM(Project Object Model&…

MATLAB知识点:矩阵的拼接和重复

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.3.4 矩阵的拼接和重复 有时候我们需要对多个矩…

云原生Kubernetes: Ubuntu 安装 K8S 1.23版本(单Master架构) 及故障恢复

目录 一、实验 1.环境 2.安装 Ubuntu 3.连接Ubuntu 4.master节点安装docker 5.node节点安装docker 6.master节点安装K8S 7.添加K8S工作节点 8.安装网络插件calico 9.故障 10.故障恢复 11.测试k8s网络和coredns 二、问题 1.Ubuntu如何修改镜像源 2.Ubuntu和Windo…

KAFKA节点故障的容错方案

KAFKA节点故障的容错方案 1. broker启动加载逻辑1.1 日志组成和分析1.2 snapshot文件1.3 broker启动流程1.4 LogManager的初始化和启动过程 2. controller高可用1.1 选主逻辑1.2 HA切换1.3 controller的职责 3. partition高可用3.1 ISR列表3.1 选举Leader 4. 疑问和思考4.1 如果…

11:按键

按键 1、按键的相关知识2、独立按键3、CPU如何处理按健4、编程测试(用LED1作为指示)5 、编程测试(用8个LED作为指示) 1、按键的相关知识 分为独立按键和矩阵按键 2、独立按键 由图得独立按键右边接地,左边独立连接到…

正则表达式可视化工具regex-vis

什么是正则表达式 ? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…

题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?

lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…

【课程作业_01】国科大2023模式识别与机器学习实践作业

国科大2023模式识别与机器学习实践作业 作业内容 从四类方法中选三类方法,从选定的每类方法中 ,各选一种具体的方法,从给定的数据集中选一 个数据集(MNIST,CIFAR-10,电信用户流失数据集 )对这…

微信小程序新手入门教程三:基础语法介绍

WXML(WeiXin Markup Language)是框架设计的一套标签语言,可以与各种组件相结合,进行页面构建。 一 常用标签 wxml的语法结构与我们熟悉的html很像,但在细节处略有不同,我们可以参考html标签对比记忆。wxm…

基于协同过滤的个性化电影推荐系统分析设计python+flask

本系统为用户而设计制作个性化电影推荐管理,旨在实现个性化电影推荐智能化、现代化管理。本个性化电影推荐自动化系统的开发和研制的最终目的是将个性化电影推荐的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利…

华为OD机试真题【日志首次上报最多积分】

1、题目描述 【日志首次上报最多积分】 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验; 如果一次上报的…

京东物流基于 StarRocks 的数据分析平台建设

作者:京东物流 数据专家 刘敬斌 小编导读: 京东集团 2007 年开始自建物流,2017 年 4 月正式成立京东物流集团,截至目前,京东物流已经构建了一套全面的智能物流系统,实现服务自动化、运营数字化及决策智能化…

whale-quant 学习 part7:量化回测

量化回测 计算策略评估指标聚宽平台量化回测实践策略实现 参考 计算策略评估指标 使用数据为:贵州茅台(600519.SH)、工商银行(601398.SH)、中国平安(601318.SH),策略基准是沪深300指…

使用输出事件激活Simulink块

什么是输出事件? 输出事件是发生在Stateflow图表中,但在图表外的Simulink块中可见的事件。这种类型的事件允许图表将图表中发生的事件通知模型中的其他块。 您可以使用输出事件来激活同一模型中的其他块。您可以在图表中定义多个输出事件,其中每个输出事件映射到一个输出端…

Flutter组件 StatefulWidget、StatelessWidget 可继承写法

前言 学过Java的同学,应该都知道面向对象语言的三大特征,封装、继承、多态; Dart也是面向对象的语言,但是在Flutter中的很多组件都被下划线 _ 标记为私有,导致无法继承,本文将介绍一种非私有的创建组件写…

大数据-Spark-关于Json数据格式的数据的处理与练习

上一篇: 大数据-MapReduce-关于Json数据格式的数据的处理与练习-CSDN博客 16.7 Json在Spark中的引用 依旧利用上篇的数据去获取每部电影的平均分 {"mid":1,"rate":6,"uid":"u001","ts":15632433243} {"m…

Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

一、前言 之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutpu…