webpack5 基本概念 —— 插件(plugin)

2023-11-07

插件 是 webpack 的 支柱 功能。

Webpack 自身也是构建于在 webpack 配置中用到的 相同的插件系统 之上!

插件目的在于解决 loader无法实现的其他事

如果在插件中使用了 webpack-sources 的 package,请使用 require('webpack').sources 替代 require('webpack-sources'),以避免持久缓存的版本冲突。

webpack 插件是一个具有 apply方法的 JavaScript 对象。

apply 方法会被 webpack compiler 调用,并且在 整个 编译生命周期都可以访问 compiler 对象。

ConsoleLogOnBuildWebpackPlugin.js

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';

class ConsoleLogOnBuildWebpackPlugin {
  apply(compiler) {
    compiler.hooks.run.tap(pluginName, (compilation) => {
      console.log('webpack 构建正在启动!');
    });
  }
}

module.exports = ConsoleLogOnBuildWebpackPlugin;

compiler hook 的 tap 方法的第一个参数,应该是驼峰式命名的插件名称。

建议为此使用一个常量,以便它可以在所有 hook 中重复使用。

用法

由于插件可以携带参数/选项,所以,必须在 webpack 配置中,向 plugins 属性传入一个 new 实例。

配置方式

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 访问内置的插件
const path = require('path');

module.exports = {
  entry: './path/my/entry/file.js',
  output: {
    filename: 'my-webpack.bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        use: 'babel-loader'
      }
    ]
  },
  plugins: [
    new webpack.ProgressPlugin(),
    new HtmlWebpackPlugin({ template: './src/index.html' })
  ]
};

ProgressPlugin 用于自定义编译过程中的进度报告,HtmlWebpackPlugin 将生成一个 HTML 文件,并在其中使用 script 引入一个名为 my-webpack.bundle.js 的 JS 文件。

Node API 方式

在使用 Node API 时,还可以通过配置中的 plugins 属性传入插件。

some-node-script.js

const webpack = require('webpack'); // 访问 webpack 运行时(runtime)
const configuration = require('./webpack.config.js');

let compiler = webpack(configuration);

new webpack.ProgressPlugin().apply(compiler);

compiler.run(function (err, stats) {
  // ...
});

项目实践

内置的 BannerPlugin 插件,用于在文件头部输出一些注释信息。

webpack.config.js 文件:


const path = require('path')
var webpack = require('webpack');

module.exports = {
  mode: 'development',
  entry: "./src/index.js",
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
  },
  plugins: [
    new webpack.BannerPlugin('这是添加的 webpack 实例注释')
  ]
};

index.js:

if (process.env.NODE_ENV !== 'production') {
  console.log('Current we are in development mode!');
}

function component () {
  const element = document.createElement('pre');

  element.innerHTML = [
    'Hello webpack!',
    '5 cubed is equal to ' ].join('\n\n');

  return element;
}

document.body.appendChild(component());

运行npm run build
请添加图片描述

可以看到,生成了main.bundle.js文件。

打开main.bundle.js:

/*! 这是添加的 webpack 实例注释 */
/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/***/ (() => {

eval("if (true) {\r\n  console.log('Current we are in development mode!');\r\n}\r\n\r\nfunction component () {\r\n  const element = document.createElement('pre');\r\n\r\n  element.innerHTML = [\r\n    'Hello webpack!',\r\n    '5 cubed is equal to ' ].join('\\n\\n');\r\n\r\n  return element;\r\n}\r\n\r\ndocument.body.appendChild(component());\n\n//# sourceURL=webpack://webpack-demo/./src/index.js?");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = {};
/******/ 	__webpack_modules__["./src/index.js"]();
/******/ 	
/******/ })()
;

可以看到,文件头部出现了指添加的注释信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack5 基本概念 —— 插件(plugin) 的相关文章

随机推荐

  • 【Linux学习】06 信号

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 信号的概念 二 Linux中信号 signal函数 1 种类 2 信号的实现机制 3 信号的处理 1 默认递送行为 2 忽略信号 3 捕捉信号并处理 具体
  • ArcGIS教程:模糊隶属

    摘要 根据指定的模糊化算法 将输入栅格转换为 0 到 1 数值范围以指示其对某一集合的隶属度 值 1 表示完全隶属于模糊集 而当值降为 0 时 则表示不是模糊集的成员 用法 此工具无法对分类数据进行度量 要将分类数据用于模糊叠加分析 需要执
  • Asp.net的GridView控件实现单元格可编辑

    最近做一个功能 考虑到用户使用方便 减少弹出页面 采用点 编辑 按钮无需弹出页面直接当前行的单元格内容就能编辑 进入页面显示如下图 点 编辑 按钮后显示如下图 编号为1的 星期 和 是否上班 均可编辑 编辑完成后 点 更新 保存 第一张图中
  • QT按钮被触发两次的问题

    QT自带翻译机制 规则强制指定 修改槽函数形式 QT自带翻译机制 如果用官方的写法on btn pressed 可以不用写connect函数 可以直接触发槽函数 如果此时用connect再次连接的话 就会导致on btn pressed 被
  • 达梦8 DMDSC集群高可用验证手册

    阅读对象 架构管理人员 架构设计人员 项目需求分析 设计开发人员 数据架构师 DBA 开发人员 定义 缩写和分类 DM DM8为达梦公司自研数据库 DMDSC DM Data Shared CLuster 简称DMDSC 共享存储数据库集群
  • 写一个字符串处理方法,去掉小数点

    Java StringUtil中使用正则表达式去除小数点后面多余的0功能 public static String removeTrim String str if str indexOf gt 0 str str replaceAll 0
  • oracle数据库服务器性能,如何调整Oracle数据库服务器的性能?

    Oracle数据库服务器是整个系统的核心 它的性能高低直接影响整个系统的性能 为了调整Oracle数据库服务器的性能 主要从以下几个方面考虑 1 调整操作系统以适合Oracle数据库服务器运行 Oracle数据库服务器很大程度上依赖于运行服
  • STM32 51单片机——搭建keil5的开发环境(ARM)

    知识点 keil proteus搭建概述 环境搭建 实训day1 12月19日 目录 1 keil安装 1 1 安装KEIL5 安装包 步骤1 步骤2 步骤3 步骤4 步骤5 1 2 添加License 步骤1 步骤2 步骤3 1 3 安装
  • chatgpt赋能python:用Python三种方法逆序输出

    用Python三种方法逆序输出 Python是一种非常流行的编程语言 它的优雅和简单易用的特性使其成为开发人员和数据科学家的首选语言 今天 我们将讨论如何用Python三种方法逆序输出 方法一 使用 1 方法 Python列表的一个重要特性
  • ELK系列(三)、安装Logstash插件及打包离线安装包

    Logstash有input output filter codec 四种插件类型 支持的种类也很丰富 功能特别强大 选对正确的插件可以节省很多的资源占用和开发效率 生产环境一般都无法连接到公网 所以本篇就带大家如何在线安装 以及打包离线安
  • LSM树存储模型

    大规模分布式存储系统 原理解析与架构实战 读书笔记 之前研究了Bitcask存储模型 今天来看看LSM存储模型 两者虽然同属于基于键值的日志型存储模型 但是Bitcask使用哈希表建立索引 而LSM使用跳跃表建立索引 这一差别导致了两个存储
  • 基于python+opencv提取视频指定关键帧

    提取关键帧 不用遍历整个视频 第一步 打开视频文件 cap cv2 VideoCapture vedio 第二步 设置视频起始帧 cap set cv2 CAP PROP POS FRAMES keys frame keys frame为关
  • 【network】网口指示灯含义

    网卡有两个指示灯及含义 连接指示灯 绿色 连接指示灯亮就代表线路连接正常 信号指示灯 黄色 在连接指示灯亮的情况下 信号指示灯的含义如下 a 如果信号指示灯闪烁 代表信号正常 正在通信 b 如果信号指示灯灭 代表没有通信 c 如果信号指示灯
  • 大学生可以做的兼职有哪些?我收集了这份兼职指南,请查收

    大学生应该以学业为主 但是对即将踏入社会的你们 提前锻炼自身 多学习一项技能 无疑是对自己的一种 增值 其实大学生平常的业余时间都是被恋爱 游戏 影音占据了大半 有兼职想法的并不是太多 有这想法的多半是一些自立 有上进心的孩子 所以对这些大
  • snprintf函数的具体用法,解释参数,返回值,带示例

    文章目录 概述 函数签名如下 以下是一个简单的示例 总结 概述 snprintf 是一个 C 标准库函数 用于格式化字符串并将结果写入指定的字符数组中 以及控制最大写入的字符数 通过第二参数size 以防止缓冲区溢出 snprintf会自动
  • 深度学习的经典算法的论文、解读和代码实现

    文章目录 CNN网络的经典算法 LeNet 5 AlexNet VGG Inception Inception v1 GoogLeNet BN Inception ResNet R CNN R CNN Fast R CNN Faster R
  • 【转】卷积神经网络如何用在NLP上

    点击前往集智专栏阅读原文 原文 Understanding Convolutional Neural Networks for NLP 作者 Denny Britz 翻译 Kaiser 当我们听到 卷积神经网络 CNN 当然 不是特朗普说F
  • python3中无法import cv2,importError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so

    这个问题就是importError opt ros kinetic lib python2 7 dist packages cv2 so 为什么会出现这个问题 因为当初安装cv2的时候 默认弄在了Python2 所以导致这个错误的产生 解决
  • sample语言词法分析_【软件设计师】程序设计语言与语言处理程序!(第八章)...

    每天1章考点 助您自学通过软考 第8章 程序设计语言与语言处理程序基础 考点梳理 考点1 编译与解释 考法分析 1 本知识点的考查形式主要有 给出编译与解释相关的描述 判断正误 给出编译各个阶段的描述 判断正误 要点分析 1 解释程序 也称
  • webpack5 基本概念 —— 插件(plugin)

    插件 是 webpack 的 支柱 功能 Webpack 自身也是构建于在 webpack 配置中用到的 相同的插件系统 之上 插件目的在于解决 loader无法实现的其他事 如果在插件中使用了 webpack sources 的 pack