Webpack插件核心原理

2023-11-20

引言

围绕 Webpack 打包流程中最核心的机制就是所谓的 Plugin 机制。

所谓插件即是 webpack 生态中最关键的部分, 它为社区用户提供了一种强有力的方式来直接触及 webpack 的编译过程(compilation process)。

今天,我们来聊聊 Webpack 中必不可少的核心 Plugin 机制 ~

Plugin

本质上在 Webpack 编译阶段会为各个编译对象初始化不同的 Hook ,开发者可以在自己编写的 Plugin 中监听到这些 Hook ,在打包的某个特定时间段触发对应 Hook 注入特定的逻辑从而实现自己的行为。

关于 Plugin 中的 Hook 内部完全是基于 tapable 来实现

Plugin 中的常用对象

首先让我们先来看看 Webpack 中哪些对象可以注册 Hook :

  • compiler Hook

  • compilation Hook

  • ContextModuleFactory Hook

  • JavascriptParser Hooks

  • NormalModuleFactory Hooks

别担心,也许对于这 5 个对象现在你会感觉到非常陌生,之后我会逐步带你攻克它们。

插件的基本构成

我们先来看这样一个最简单的插件,它会在 compilation(编译)完成时执行输出 done :

class DonePlugin {
   
  apply(compiler) {
   
    // 调用 Compiler Hook 注册额外逻辑
    compiler.hooks.done.tap('Plugin Done', () => {
   
      console.log('compilation done');
    });
  }
}

module.exports = DonePlugin;

此时,在 compilation 完成时打包终端会打印出来一行 compilation done

我们可以看到一个 Webpack Plugin 主要由以下几个方面组成:

  • 首先一个 Plugin 应该是一个 class,当然也可以是一个函数。

  • 其次 Plugin 的原型对象上应该存在一个 apply 方法,当 webpack 创建 compiler 对象时会调用各个插件实例上的 apply 方法并且传入 compiler 对象作为参数。

  • 同时需要指定一个绑定在 compiler 对象上的 Hook , 比如 compiler.hooks.done.tap 在传入的 compiler 对象上监听 done 事件。

  • 在 Hook 的回调中处理插件自身的逻辑,这里我们简单的做了 console.log。

  • 根据 Hook 的种类,在完成逻辑后通知 webpack 继续进行。

插件的构建对象

上边我们有提到过 Webpack Plugin 中哪些对应可以进行 Hook 注册,接下来我会带你深入这 5 个对象。

理解它们是理解并应用 Webpack Plugin 的重中之重。

compiler 对象

class DonePlugin {
   
  apply(compiler) {
   
    // 调用 Compiler Hook 注册额外逻辑
    compiler.hooks.done.tapAsync('Plugin Done', (stats, callback) => {
   
      console.log(</
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webpack插件核心原理 的相关文章

  • 如何配置 Webpack 5 包以使用全局 jQuery?

    我有一个正在加载 jQuery 的网页 其中有一个指向 CDN 的脚本标记 我正在将 jQuery 加载到全局范围内 并且在整个站点中都有少量 JS 使用它 这一切都工作正常 我想继续以这种方式加载 jQuery 除此之外 我使用 Webp
  • Vue cli 3项目,图像路径中的动态src不起作用

    我在 vue 组件中引用图像 url 例如 img alt Vue logo src statics reports logo png 这有效 但在尝试的同时 img alt Vue logo data return imgPath sta
  • 为什么需要在父子组件中多次导入React?

    如果您有已导入的父组件文件React 为什么它的任何渲染的子文件也需要导入 React 这是否只是一种安全措施 以防这些子项被渲染到尚未导入 React 的其他地方 In nodejs每个文件都是一个模块 有自己的变量范围 当您将变量导入文
  • AngularJS 和 Webpack 集成

    我正在寻找一些使用帮助webpack http webpack github io docs 对于大型 AngularJS 应用程序 我们使用基于功能的文件夹结构 每个功能 页面都有一个模块 并且它们有控制器 指令 我已经成功配置了 web
  • post-css 未从 node_modules 找到路径

    我目前有一个 Angular 项目 我希望使用 purgecss 清除 css 我已经一切正常 但是当我导入 node modules 时 它很困难 因为它找不到位于 node modules 文件夹中的路径 我有当前的app scss f
  • ReactJS React-pdf 错误“无法加载 PDF 文件。”经过一些尝试

    我创建了一个 React js 应用程序create react app我正在尝试react pdf查看 pdf 我遇到的问题是我的代码有时有效 有时无效 当我第一次加载应用程序时 pdf 总是加载得很好 但如果我访问网站上的其他链接 ur
  • webpack - 如何将捆绑包提取到各个组件

    我想从bundle js 一个webpack文件 中解压 提取所有组件和js文件 我只留下这个文件 我已经用谷歌搜索并尝试了几种方法来解压捆绑js文件 但它没有成功 我也尝试过该解决方案 请查找参考 如何提取Webpack中的bundle
  • Webpack 错误:配置具有未知属性“postcss”

    升级到最新版本的 webpack 后 我看到以下错误 WebpackOptionsValidationError Invalid configuration object Webpack has been initialised using
  • 如何在 Rollup 中配置从多个输入文件仅生成单个输出文件?

    配置Rollupjs生成库时 如果输入是由多个javascript文件组成的数组 我们如何才能将这些输入生成为一个输出 js 文件呢 export const lgService input src app services livegiv
  • 如何预渲染多个Vue应用页面?

    我正在尝试 未成功 在使用 Vue CLI 搭建的同一项目中预渲染多个 Vue 应用程序的 HTML 由于多种原因 我不想使用 Vue Router 或 Nuxt 等 我尝试过使用预渲染 Spa 插件 https github com ch
  • 如何在 Vue.js 中排除文件(例如配置文件)?

    https cli vuejs org config configurewebpack https cli vuejs org config configurewebpack https cli vuejs org config chain
  • Webpack 编译的 Chrome 扩展抛出 `unsafe-eval` 错误

    使用 Webpack 编译后重新加载 Chrome 扩展时出现此错误 Uncaught EvalError Refused to evaluate a string as JavaScript because unsafe eval is
  • JavaScript:解决意外字符“#”

    介绍 我的 React 应用程序可以执行npm run build在开发模式下 webpack config dev js 但不在生产模式下 webpack config prod js 抛出以下错误 Module parse failed
  • npm install -D sass-loader node-sass Vue.js 2021

    您好 问题是为 Vue js 设置 SASS 我跑 Node js 15 7 0 Vue js vue cli 4 5 11 这是我在运行此命令时在控制台中遇到的错误 npm install D sass loader 节点 sass np
  • “找不到模块:错误:无法解析模块‘react/lib/ReactMount’”

    我使用Reactjs和webpack启动一个项目 当我在命令提示符中运行 node server 时 出现如下错误 并且chrome浏览器打开成功但也出现问题如下 github是 github com Yangqin0607 gallery
  • 从react-loadable中命名webpack块

    我已经成功在我的项目中添加了react loadable库以启用代码分割 我发现的唯一问题是webpack生成的块没有命名 它们被赋予了整数名称 我的反应可加载使用代码是 const AppRootLoadable Loadable loa
  • 让Webpack不捆绑文件

    所以现在我正在使用一个原型 我们使用 webpack 用于构建 tsx 文件和复制 html 文件 和 webpack dev server 之间的组合来提供开发服务 正如您可以假设的那样 我们也使用 React 和 ReactDOM 作为
  • 如何将函数导入到Vue组件中?

    我正在尝试将单个函数导入到我的 Vue 组件中 我为我的函数创建了一个单独的 js 文件 randomId js exports randomId gt My function 在我的 Vue 组件中 我导入了 Random js let
  • 无法使用 webpack 加载 Node 原生插件

    虽然我正在使用vue cli在生成 webpack 配置的示例代码中 没有任何特定于 vue 的内容 我像这样创建示例应用程序 vue init webpack webpack modules example 生成webpack base
  • 如何在create-react-app中注入没有REACT_APP前缀的dotenv变量?

    我有一个项目要从旧版 React 应用程序迁移到标准版create react app一个 未弹出 在遗留项目中 它手动加载 env文件与dotenv and dotenv expand并通过webpack注入DefinePlugin cr

随机推荐

  • 2022/9/6小结

    成长 是一个探索自我的过程 看 了不起的我 这本书 不知道是那句话 那个段落 或者那一章触动到了我 曾经我无法发自内心地去读书 去感受书中的情感 或悲伤 或喜悦 曾经我迫切地想通过书籍获得一项技能 获得一种读书人的气质 很幼稚 我不是在读书
  • Linux绑核效率优化

    Linux绑核效率优化 原理概述 cpu一般有多个物理核心 但在运行进程和线程时候 可以将其绑定或者指定到某一个或者多个核心上运行 这样做的好处是 一般在核数比较多的机器上 会有多个CPU共享三级缓存cache的情况 当出现跨cache数据
  • electron创建新窗口(模态框)并相互传值,主进程传值给子进程

    我们在开发的过程中难免会遇到需要创建一个子窗口 子进程 但是在这个子进程中所有值都是初始化的 而我们肯定是需要一些值才能进行下一步操作 比如 token 那么我们怎么去传递值呢 我先给伙伴们说一些 基本原理 下面很多东西会建立在vue的基础
  • line-height: 1

    价格文字 问题 新价格 旧价格 每个都设置了自己的line height 结果就是 新价格 旧价格 的底部没有与父元素 div 贴底 样式调试起来很难 解决办法 新价格 旧价格 的 line height 都设置为 1 成功
  • chrony配置服务器时间同步

    chrony 设置时区 timedatectl set timezone Asia Shanghai 查看时区 timedatectl date R 设置时间 date s 20211109 11 32 30 时区和时间配置好之后 配置ch
  • STM32--IIC

    1 IIC总线协议介绍 IIC Inter Integrated Circuit 集成电路总线 是一种同步串行半双工通信总线 IIC总线结构图 由时钟线SCL和数据线SDA组成 并且都接上拉电阻 确保总线空闲状态为高电平 总线支持多设备连接
  • antd + react model自定义footer_阿里开源可插拔的企业级React应用框架——UmiJS

    介绍 UmiJS 五米 是阿里开源的可插拔企业级React应用框架 为什么说是可插拔 是因为它的整个生命周期都是插件化的其内部也有很多都是通过插件来实现的 其中大家熟知的Ant Design pro就是基于umi构建的 官方文档 中文文档
  • Zabbix安装部署(国内源镜像)----一次性解决centos7安装zabbix报错:[Errno 256] 的问题

    Zabbix安装部署 环境准备 OS CentOS 7 安装步骤 一 关闭selinux和iptables root localhost systemctl stop firewalld service root localhost set
  • 相关性分析p值_相关性分析的结果解读及说明

    下图是三个不同的变量 Y 分别与变量X的相关性分析结果 1 相关系数r r 1 二者具有完美的正相关 r 0到1之间 两个变量一起增加或者一起减少 r 0 二者没有相关性 r 1到0 一个变量随着另一个变量的增加而减少 或者减少而增加 r
  • Feign客户端 - 超时时间配置

    Spring Cloud 专栏收录该内容 7 篇文章0 订阅 订阅专栏 Spring Cloud中Feign客户端是默认开启支持Ribbon的 最重要的两个超时就是连接超时ConnectTimeout和读超时ReadTimeout 在默认情
  • vue3前端以json样式输入组件实现

    在 Vue 3 中 你可以创建一个组件 让用户输入 JSON 并将这个 JSON 渲染成某种样式或结构 以下是一个简单示例 它涵盖了如何在 Vue 3 中创建一个接受 JSON 输入并呈现其内容的组件 Setup Vue Project 如
  • IO多路复用

    1 IO模型 IO模型是指四种不同的文件读写方式 1 阻塞IO 阻塞IO是最常用 最简单 效率最低的一种IO模型 阻塞读 如果有数据可读 则直接读取数据 如果没有数据可读 则读会阻塞 直到读取到数据 或 出错才返回 阻塞写 如果有空间可供写
  • python3(四)Pandas库

    数据摘要pandas 目录 1 pandas库 1 1 pandas库 1 2 Series类型 1 3 Series类型的基本操作 1 4 DataFrame类型 1 5 数据类型操作 1 6 数据类型运算 2 数据特征分析 2 1 数据
  • c#获取cpu序列号

  • RabbitMQ集群架构模式

    搭建Mirror镜像集群 4369是erlang的发现端口 5672是rabbitmq的通信端口 15672是rabbitmq的可视化控制台的端口号 25672是erlang底层发送消息和分配消息的底层端口 firewall cmd zon
  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • 软件测试之第九章 搭建Web服务器

    第九章 搭建 Web 服务器 一 Web 简介 1 网页 通过浏览器打开的任意一个页面 窗口 本质上是服务器中的一个文件 是使用如 html asp aspx php jsp cgi 等语言编写的代码文件 扩展名有 htm html sht
  • The OpenWire Wire Format

    The OpenWire Wire Format 字面意思是 开放连接是默认连接 传输 格式 开放连接是activemq的默认连接格式 它提供一种高效率的二进制格式来使消息高速传输 开放连接能够被JMS的客户端配置为连接URL字符串 或者一
  • GSM模块_GPRS数据传输机制和原理

    通信专业术语 BSS 基站子系统 通过无线接口与移动台直接联系 负责在一定区域内和移动台通信 GSM BTS 基站收发台 可以看作一复杂的无线调制器 BSS的主要部分 每个分配有若干信道 GSM RBS Radio Base Station
  • Webpack插件核心原理

    引言 围绕 Webpack 打包流程中最核心的机制就是所谓的 Plugin 机制 所谓插件即是 webpack 生态中最关键的部分 它为社区用户提供了一种强有力的方式来直接触及 webpack 的编译过程 compilation proce