从loader和plugin开始了解webpack

目录

  • 一、webpack中loader和plugin的区别
    • 1. Loader(每个 Loader 是一个函数或对象)
    • 2.plugin(每个 Plugin 是一个实例)
    • 3.自定义loader和plugin
  • 二、Babel的功能
  • 三、Plugin中的compiler和compilation对象
    • 1. compiler对象
    • 2. compilation对象

一、webpack中loader和plugin的区别

1. Loader(每个 Loader 是一个函数或对象)

  • 功能:文件转换 --> 将源文件转换为webpack可以处理的模块
  • 处理单位:单个文件(.js,.css,.png)
  • 执行顺序:链式调用,按配置顺序依次执行(源文件 -> Loader1 -> Loader2 -> … -> Webpack可用模块)
// webpack.config.js
module: {rules: [{test: /\.css$/,use: [ // 执行顺序从后到前'style-loader',  // 将CSS注入DOM'css-loader',    // 解析CSS中的@import和url(),支持css modules'postcss-loader' // 添加浏览器前缀]}]
}
  • 常用Loader
    代码转换:Babel(.js),TypeScript(.ts)
    样式处理:css-loader,sass-loader,postcss-loader
    文件处理:file-loader,url-loader(小图转为Base64),svg-loader
    模版编译:pug-loader,handlebard-loader

2.plugin(每个 Plugin 是一个实例)

  • 功能:扩展功能 --> 在Webpack构建流程的特定阶段执行自定义逻辑
  • 处理单位:整个构建过程(如打包完成后生成HTML文件)
  • 执行顺序:基于事件钩子,可在特定阶段多次触发(Webpack启动 -> 触发各种事件钩子 -> Plugin监听特定钩子并执行逻辑)
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');plugins: [new HtmlWebpackPlugin({template: './src/index.html' // 基于模板生成HTML})
]
  • 常用Plugins
    CleanWebpackPlugin(),// 每次构建前清空dist目录
    MiniCssExtractPlugin(), // 提取CSS到单独文件,通常生产环境中,替代style-loader
    TerserPlugin(), // 压缩JS
    HtmlWebpackPlugin(), // 生成 HTML

3.自定义loader和plugin

  1. 极简的loader
module.exports = function(source) {// source: 输入的文件内容(字符串或Buffer)// 获取loader配置参数,this.getOptions 是 Webpack 提供的标准化参数获取方式const options = this.getOptions() || {};// 处理逻辑...return source; // 返回处理后的内容
};
  1. 极简的plugin
class MyPlugin {constructor(options) {this.options = options; // 接收配置参数}apply(compiler) { // compiler见下// 注册钩子监听编译过程compiler.hooks.someHook.tap('MyPlugin', (compilation) => { // compilation见下// 处理逻辑...});}
}module.exports = MyPlugin;

二、Babel的功能

一句话概括:Babel的功能是JavaScript代码转换

  • 可处理:ES6+语法转为ES5兼容形式、API补全(Promise,Array.includes)、适配不同浏览器|node版本等
  • Babel 的核心是插件系统,每个转换功能由独立插件实现
// babel.config.js
module.exports = {plugins: ["@babel/plugin-transform-arrow-functions", // 转换箭头函数"@babel/plugin-transform-classes", // 转换 class 语法"@babel/plugin-proposal-object-rest-spread" // 转换展开运算符]
};
  • Presets(预设):预设是一组插件的集合,避免手动配置大量插件
// babel.config.js
module.exports = {presets: ["@babel/preset-env", // 智能转换 ES6+ 代码"@babel/preset-react", // 转换 JSX"@babel/preset-typescript" // 转换 TypeScript]
};
  • Babel 的工作流程:解析代码 → 转换 AST → 生成新代码。
  • Babel常和webpack协作,通过babel-loader作为桥梁
// webpack.config.js
module.exports = {module: {rules: [{test: /\.js$/,use: {loader: 'babel-loader', // 调用Babel编译JS文件options: {presets: ['@babel/preset-env']}}}]}
};

三、Plugin中的compiler和compilation对象

1. compiler对象

全局单例,代表整个webpack编译过程,包含所有配置信息,监听编译全过程(compile、emit、done)

  • compile:当 Webpack 开始新的一轮编译时触发(在读取配置后,真正编译前) —> 获取编译配置、修改默认行为
  • emit:在文件输出到磁盘前触发(所有模块已编译,资源已生成)。 —> 修改输出资源(如重命名文件、添加额外内容)。
  • done:整个编译过程完成时触发(文件已写入磁盘)。 —> 执行编译后的操作(如通知构建完成、生成报告)。

2. compilation对象

每次构建创建,代表一次具体的编译过程,包含当前构建的所有模块、资源和依赖关系,可修改、添加或删除构建产物

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

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

相关文章

36-Oracle Statistics Gathering(统计信息收集)

小伙伴们,有没有因为统计信息不准,导致了业务卡顿,各种状况频出,这几天在实践和实操的过程中,时不时就需要进行统计信息的收集。同时统计信息收集的动作也是OCM必考内容。 数据库中的数据是地图,统计信息是…

Linux驱动程序(PWM接口)与超声波测距

一、利用阿里云服务器实现树莓派外网访问(SSH 反向代理) 1. 树莓派端配置 步骤 1:安装 SSH 服务(若未安装) sudo apt-get install openssh-server 步骤 2:创建反向代理连接 -p 22:指定阿里…

Web攻防-XSS跨站文件类型功能逻辑SVGPDFSWFHTMLXMLPMessageLocalStorage

知识点: 1、Web攻防-XSS跨站-文件类型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能逻辑-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件类型触发XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

强大模型通过自我和解进步——Unsupervised Elicitation of Language Models——论文阅读笔记

本周关注的工作是:Unsupervised Elicitation of Language Models 这篇文章通篇体现了这样一件事——香蕉皮大需要香蕉大! 一句话总结 首先注意:这个工作不是面向对齐的,而是写【如何准备】对齐任务的Reward Model需要的数据集的…

Qt—(Qt初识,槽,信号,事件)

一 Qt初识 暂时不写了 我的理解是类似于c#,是一个组件库,不局限是一个组件框架。 二 Qt Core Qt Core 是 Qt 框架的基础模块,提供非 GUI 的核心功能: 核心类:QObject(信号槽机制)、QEvent&…

深度学习——基于卷积神经网络实现食物图像分类【2】(数据增强)

文章目录 引言一、项目概述二、环境准备三、数据预处理3.1 数据增强与标准化3.2 数据集准备 四、自定义数据集类五、构建CNN模型六、训练与评估6.1 训练函数6.2 评估函数6.3 训练流程 七、关键技术与优化八、常见问题与解决九、完整代码十、总结 引言 本文将详细介绍如何使用P…

详细说说分布式Session的几种实现方式

1. 基于客户端存储(Cookie-Based) 原理:将会话数据直接存储在客户端 Cookie 中 实现: // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama访问模型,为什么会出现模型胡乱输出,然后过一会儿再访问,就又变成正常的

例子:大模型推理遇到内存不足 1. 场景还原 你在Mac上用Ollama运行如下代码(以Python为例,假设Ollama有API接口): import requestsprompt "请写一首关于夏天的诗。" response requests.post("http:…

简说 Linux 用户组

Linux 用户组 的核心概念、用途和管理方法,尽量简明易懂。 🌟 什么是 Linux 用户组? 在 Linux 系统中: 👉 用户组(group) 是一组用户的集合,用来方便地管理权限。 👉 用…

S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解

1:S32K328的基础信息 S32K328官网介绍 由下图可知,S32K328的最大主频为 240MHz 2:S32K328时钟树配置 2.1 system clock node 节点说明 根据《S32K3xx Reference Manual》资料说明 Table 143 各个 系统时钟节点 的最大频率如下所示&#…

wordpress小语种网站模板

wordpress朝鲜语模板 紫色风格的韩语wordpress主题,适合做韩国、朝鲜的外贸公司官方网站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 绿色的日语wordpress外贸主题,用来搭建日文外贸网站很实用。 https://www.jianzhanpress.co…

网络:Wireshark解析https协议,firefox

文章目录 问题浏览器访问的解决方法python requests问题 现在大部分的网站已经切到https,很多站点即使开了80的端口,最终还是会返回301消息,让客户端转向到https的一个地址。 所以在使用wireshark进行问题分析的时候,解析tls上层的功能,是必不可少的,但是这个安全交换的…

ollama部署开源大模型

1. 技术概述 Spring AI:Spring 官方推出的 AI 框架,简化大模型集成(如文本生成、问答系统),支持多种 LLM 提供商。Olama:开源的本地 LLM 推理引擎,支持量化模型部署,提供 REST API …

Kafka 可靠性保障:消息确认与事务机制(二)

Kafka 事务机制 1. 幂等性与事务的关系 在深入探讨 Kafka 的事务机制之前,先来了解一下幂等性的概念。幂等性,简单来说,就是对接口的多次调用所产生的结果和调用一次是一致的。在 Kafka 中,幂等性主要体现在生产者端&#xff0c…

使用 React.Children.map遍历或修改 children

使用场景: 需要对子组件进行统一处理(如添加 key、包裹额外元素、过滤特定类型等)。 动态修改 children 的 props 或结构。 示例代码:遍历并修改 children import React from react;// 一个组件,给每个子项添加边框…

智能体三阶:LLM→Function Call→MCP

哈喽,我是老刘 老刘是个客户端开发者,目前主要是用Flutter进行开发,从Flutter 1.0开始到现在已经6年多了。 那为啥最近我对MCP和AI这么感兴趣的呢? 一方面是因为作为一个在客户端领域实战多年的程序员,我觉得客户端开发…

flutter的常规特征

前言 Flutter 是由 Google 开发的开源 UI 软件开发工具包,用于构建跨平台的高性能、美观且一致的应用程序。 一、跨平台开发能力 1.多平台支持:Flutter 支持构建 iOS、Android、Web、Windows、macOS 和 Linux 应用,开发者可以使用一套代码库在…

【Git】代码托管服务

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 格言: 大鹏一日同风起,扶摇直上九万里。 文章目录 Git代码托管服务概述Git核心概念主流Git托管平台Git基础配置仓库创建方式Git文件状态管理常用…

Android 网络请求的选择逻辑(Connectivity Modules)

代码分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 许多APN已经弃用,应用层统一用 requestNetwork() 来请求网络。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立与数据库连接(版本问题的解决方案)踩坑总结

1.如何优雅的建立数据库连接 今天使用这个deepseek写代码,主要就是建立数据库的链接,包括这个建库建表啥的都是他整得,我就是负责执行,然后解决这个里面遇到的一些问题; 其实我学习这个C#不过是短短的4天的时间&…