webpack(四)plugin

news2024/11/27 0:35:09

定义

和loader的区别

  • loader:文件加载器,能够加载资源,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中。
  • plugin:赋予了webpack各种灵活的功能,例如打包优化、资源管理、环境变量注入等,目的是解决loader无法实现的其它事。
    在这里插入图片描述
    loader运行在打包文件之前,plugin在整个编译周期都起作用
    webpack运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的api改变输出结果。
    对于loader,实际上是一个转换器,将A文件进行编译形成B文件,操作的是文件,比如将A.scssA.less转化为B.css,单纯的文件转换过程。

特性

本质是一个具有apply方法的js对象
apply方法会被webpack compiler调用,并且在整个编译生命周期都可以访问compiler对象
compiler hooktap方法的第一个参数,应是驼峰式命名的插件名称

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';

class ConsoleLogOnBuildWebpackPlugin {
  apply(compiler) {
    compiler.hooks.run.tap(pluginName, (compilation) => {
      console.log('webpack 构建过程开始!');
    });
  }
}

module.exports = ConsoleLogOnBuildWebpackPlugin;

生命周期:

  • entry-option :初始化 option
  • run
  • compile: 真正开始的编译,在创建 compilation 对象之前
  • compilation :生成好了 compilation 对象
  • make 从 entry 开始递归分析依赖,准备对每个模块进行 build
  • after-compile: 编译 build 过程结束
  • emit :在将内存中 assets 内容写到磁盘文件夹之前
  • after-emit :在将内存中 assets 内容写到磁盘文件夹之后
  • done: 完成所有的编译过程
  • failed: 编译失败的时候

常见Plugin

clean-webpack-plugin

构建时,清除dist包

npm install --save-dev clean-webpack-plugin

const { CleanWebpackPlugin } = require('clean-webpack-plugin')
module.exports = {
plugins: [
        new CleanWebpackPlugin()
    ]
}

测试,在dist中添加一个test.txt文件,重新运行打包命令,test.txt消失

html-webpack-plugin

构建时,帮助我们自动创建一个index.html文件,并把打包生成的js 模块引⼊到该 html

 npm i html-webpack-plugin -D
 
 const HtmlWebpackPlugin = require('html-webpack-plugin')
 module.exports = {
plugins: [
        new HtmlWebpackPlugin({
         title: "My App", //修改页面的title
       filename: "app.html", // 
       template: "./public/index.html" //指定index文件位置,以我提供的html模板为基准生成index.html文件
        })
    ]
}


<!--./public/index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><%=htmlWebpackPlugin.options.title%></title>
</head>
<body>
    <h1>html-webpack-plugin</h1>
</body>
</html>

测试,创建public/index.html文件,添加一些内容,打包后在dist中生成index.html文件会包含public/index.html文件中的内容

DefinePlugin

在这里插入图片描述
给我们自定义模板中填充数据,定义常亮填充数据
使用内置插件DefinePlugin

new DefinePlugin({
            BASE_URL: '"./"'//希望是同级进行查找,相当于把值原封不动的拿出去 是./ 所以需要再包一层
        })

babel-loader

babel原理

为什么需要babel:开发时写了ts、jsx、es6+等,需要转换为浏览器可以识别的
安装核心:npm i @babel/core (为了能在命令行使用npm i @babel/cli -D)

命令行转化npx babel src --out-dir build,项目中多了build/js/index.js文件,但是没有对箭头函数和const关键字进行转换
继续安装npm i @babel/plugin-transform-arrow-functions -D,命令行npx babel src --out-dir build --plugins=@babel/plugin-transform-arrow-functions,发现箭头函数完成了转换

const title='前端'
const foo = () =>{
    console.log(title)
}
foo()

const title = '前端';
const foo = function () {
  console.log(title);
};
foo();

继续完成constvar的转化,npm i @babel/plugin-transform-block-scoping -D

var title = '前端';
var foo = function () {
  console.log(title);
};
foo();

babel会结合插件对js代码进行转换
我们实际开发提供了一个预设npm i @babel/preset-env -D,防止我们所需要什么转换还需要自己去安装,这是一个集合包含了大部分的babel插件
npx babel src --out-dir build --presets=@babel/preset-env
添加了严格模式

"use strict";

var title = '前端';
var foo = function foo() {
  console.log(title);
};
foo();

babel-loader处理

npm i babel-loader
会根据我们.browserslistrc文件中的配置去进行兼容处理,如果我们同时配置了target,则会根据target为主进行打包

module.exports = {
...
module: {
        rules: [
        ...,
         {
            test: /.\.js$/,
                use: [{
                    loader:'babel-loader',
                    options:{
                        [presets:['@babel/preset-env',{targets:'chrome 91'}]]
                    }
                }]
            }
]
}
}

babel-loader相关的配置文件

  • babel.config.js(json) 目前是多包管理的方式,推荐使用这种方式
  • babelrc.json(js)babel7之前使用

项目中新建babel.config.js文件

module.exports = {
    presets: ['@babel/preset-env']
}
// webpack.config.js
{
                test: /.\.js$/,
                use: ['babel-loader']
            }

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

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

相关文章

【c++ debug】cmake编译报错 No such file or directory

1. 报错&#xff1a;error while loading shared libraries: libprotoc.so.24: cannot open shared object file: No such file or directory 问题原因&#xff1a;找不到动态库 解决方法&#xff1a;添加动态库路径 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/your/protobuf/l…

企业架构LNMP学习笔记18

nginx的日志&#xff1a; 日志类型&#xff1a; access.log 访问日志、查看统计用户的访问信息&#xff0c;流量。 error.log 错误日志&#xff0c;错误信息&#xff0c;重写信息。 access.log日志文件内容示例&#xff1a; 192.168.17.1 - - [06/Sep/2023:20:37:39 0800] …

莫迪会见英伟达ceo黄仁勋:印度在人工智能领域的巨大潜力

据外媒报道&#xff0c;印度总理纳伦德拉莫迪&#xff08;Narendra Modi&#xff09;于9月5日晚上会见了英伟达创始人兼首席执行官&#xff08;CEO&#xff09;黄仁勋&#xff0c;讨论了印度在人工智能&#xff08;AI&#xff09;领域的巨大潜力。这是莫迪和黄仁勋的第二次会面…

LC2335. 装满杯子需要的最短总时长(JAVA)

装满杯子需要的最短总时长 题目描述递归法代码演示数学法代码演示 题目描述 难度 - 简单 Leetcode - 2335. 装满杯子需要的最短总时长 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下…

通过wordpress 自定义主题的额外CSS删除指定区块

最近用wordpress建站&#xff0c;想要删除指定区块&#xff0c;发现相关的教程蛮少的&#xff0c;作为小白的我搜了相关教程&#xff0c;好像没找到&#xff0c;只能自己慢慢摸索了&#xff0c;看了很多&#xff0c;终于尝试实现了&#xff0c;特记录下&#xff0c;免得自己忘了…

国美零售上半年几乎“全军覆没”,黄光裕回归后的至暗时刻

在黄光裕“回归”的900天之后&#xff0c;国美零售&#xff08;00493&#xff09;迎来了有史以来最为艰难的至暗时刻&#xff0c;营收同比暴跌超96%&#xff0c;股价为0.053港元&#xff0c;市值仅剩25.79亿港股。 2023年8月31日&#xff0c;国美零售发布了2023年上半年财报。报…

深入研究 Spring Cloud 和 Dubbo

什么是 SpringCloud Spring Cloud 框架为开发人员提供了快速构建健壮云应用程序的工具。我们还可以构建基于微服务的应用程序&#xff0c;例如配置管理、服务发现、断路器、智能路由、集群状态、微代理、控制总线、一次性令牌等。使用 Spring Cloud&#xff0c;开发人员可以快…

F5负载均衡融入新理念,全栈分布式云可持续发展

伴随企业上云速度加快&#xff0c;市场对云计算不断提出更高要求&#xff0c;中国分布式云计算发展进入实践落地阶段。作为一个因负载均衡而闻名的公司&#xff0c;F5紧密关注“加快建设数字中国”“加快发展方式绿色转型”等重大战略&#xff0c;积极探索分布式云计算的发展的…

使用Python实现二维应力云图

要画应力分布云图&#xff0c;可以使用Python中的科学计算和可视化库来实现 import numpy as np import matplotlib.pyplot as plt# 生成示例数据 x np.linspace(0, 10, 100) # X轴数据范围 y np.linspace(0, 5, 50) # Y轴数据范围 X, Y np.meshgrid(x, y) # 生成网…

2001-2022年上市公司供应链研究数据大全

2001-2022年上市公司供应链研究数据大全 1、时间&#xff1a;2001-2022年 2、指标&#xff1a; 供应链集中度指标、第一大客户销售额、前五大客户销售额、第一大供应商采购额、前五大供应商采购额、营业总收入、第一大客户销售额占总销售额比率、第一大供应商采购额 占总采购…

axmol引擎支持构建WASM了,非常简单

自axmol-2.0.0-rc6起&#xff0c;axmol引擎带了了实验性的wasm构建支持&#xff0c;提供简单易用的命令即可构建wasm应用在浏览器上跑&#xff0c;具体步骤&#xff1a; 下载最新引擎仓库&#xff0c;git clone https://github.com/axmolengine/axmol 并进入引擎根目录Windows…

git修改默认分支

git checkout 分支 切换到当前分支 git branch --set-upstream-toorigin/complete(远程分支名) 设置当前分支的上游分支为远程分支complete git branch --unset-upstream master 取消master上游分支的身份 现在&#xff0c;使用git commit&#xff0c;git push 命令可以直接…

【数学建模竞赛】评价类赛题常用算法解析

解析常见的评价类算法 常见的评价类算法 层次分析法 层次分析法&#xff08;Analytic Hierarchy Process&#xff0c;简称AHP&#xff09;是一种主观赋值评价方法&#xff0c;由美国运筹学家Saaty于20世纪70年代初期提出。该方法将与决策有关的元素分解成目标、准则、方案等多…

C++的向上转型

在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍…

TreeList 的 增加、删除节点-----DevExpress

private void FrmDictionaryManaged_Load(object sender, EventArgs e){// treeList1.DataSource CreateDataTable();treeList2.DataSource CreateTreeList();// 绑定TreeList控件到数据源treeList1.DataSource GetData();treeList1.KeyFieldName "ID";treeList1.…

【Python小项目之Tkinter应用】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件

文章目录 一、项目背景二、需求分析UI界面设计如下&#xff1a;具体需求如下&#xff1a; 二、实现思路三、项目关键代码读取excel中的人员名单实现随机滚动抽取主函数中Tkinter的界面相关操作实现窗口相关背景图设置组件相关 完整代码 四、将程序封装成.exe可执行文件将代码转…

【C++基础】6. 常量

文章目录 【 1. 常量的分类 】1.1 整型常量1.2 浮点常量1.3 字符常量1.4 字符串常量1.5 布尔常量 【 2. 常量的定义 】2.1 #define 预处理器2.2 const 关键字 常量 是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。常量可以是任何的基本数…

Linux C进程间通信(IPC)

概述 每个进程有独立的进程空间&#xff1a; 好处————安全 缺点&#xff1a;开销大&#xff08;独立的地址空间&#xff09;&#xff1b;进程的通信更加困难&#xff08;对其他进程的操作开销也大&#xff09; 广义上的进程间通信&#xff1a; A进程写给文件/数据库&am…

重拾html5

新增的position: sticky; 基于用户的滚动位置来定位&#xff0c;粘性定位的元素是依赖于用户的滚动&#xff0c;在 position:relative 与 position:fixed 定位之间切换。ie15以上的低版本不支持&#xff0c;Safari 需要使用 -webkit- prefix&#xff1b; vertical-align: midd…

ToBeWritten之数据源

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…