webpack 常用插件

news2025/1/13 7:35:05
  1. clean-webpack-plugin
    这个插件的主要作用是清除构建目录中的旧文件,以确保每次构建时都能得到一个干净的环境。
var { CleanWebpackPlugin } = require("clean-webpack-plugin")
const path = require("path");

module.exports = {
    mode: "development",
    devtool: "source-map",
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "[name].[chunkhash:5].js"
    },
    plugins: [
        new CleanWebpackPlugin()
    ]
}

默认情况下,CleanWebpackPlugin 会清除输出目录(即 output.path 指定的目录)中的所有文件和子目录。如果您想自定义哪些文件或目录需要被清除,您可以在创建 CleanWebpackPlugin 实例时传递一个选项

new CleanWebpackPlugin({
  cleanOnceBeforeBuildPatterns: ['**/*', '!/important-file.txt'],
})

在这个例子中,cleanOnceBeforeBuildPatterns 选项是一个字符串数组,用于指定需要被清除的文件或目录。在这个例子中,所有文件和目录都会被清除,但是名为 ‘important-file.txt’ 的文件将被排除在清除之外。

  1. html-webpack-plugin
    在 Webpack 中,html-webpack-plugin 是一个用于生成 HTML 文件的插件。template 参数是这个插件的一个重要配置选项,它指定了要使用的 HTML 模板文件的路径。

当您使用 html-webpack-plugin 时,通常会提供一个 HTML 模板文件,该文件包含了网站的基本结构和引用。html-webpack-plugin 会读取这个模板文件,并根据您的 Webpack 配置和入口点来生成最终的 HTML 文件。
chunks 参数是这个插件的一个重要配置选项,它指定了应该在最终生成的 HTML 文件中包含哪些 chunk(即代码块)

const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require('html-webpack-plugin')
const path = require("path");
module.exports = {
    mode: "development",
    devtool: "source-map",
    entry: {
        home: "./src/index.js",
        a: "./src/a.js"
    },
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "scripts/[name].[chunkhash:5].js"
    },
    plugins: [
        new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns: ["dist/**/*"] }),
        new HtmlWebpackPlugin({
            template: "./public/index.html",
            filename: "home.html",
            chunks: ["home"]
        }),
        new HtmlWebpackPlugin({
            template: "./public/index.html",
            filename: "a.html",
            chunks: ["a"]
        })
    ]
}
  1. copy-webpack-plugin
    复制某个文件或整个文件夹到生成目录中
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin');
const path = require("path");
module.exports = {
    mode: "development",
    devtool: "source-map",
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "scripts/[name].[chunkhash:5].js"
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template: "./public/index.html"
        }),
        new CopyPlugin([
            { from: "./public", to: "./" }
        ])
    ]
}

在这里插入图片描述
复制public下的文件和文件夹到dist目录下。

  1. webpack-dev-server
    open:true,告诉 dev-server 在服务器已经启动后打开浏览器。设置其为 true 以打开你的默认浏览器。
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
    mode: "development",
    devtool: "source-map",
    output: {
        filename: "scripts/[name].[chunkhash:5].js"
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template: "./public/index.html"
        })
    ],
    devServer: {
        port: 8000,
        open: true,
        proxy: { //代理规则
            "/api": {
                target: "https://www.bing.com",
                changeOrigin: true //更改请求头中的host和origin
            }
        }
    },
    stats: {
        modules: false,
        colors: true
    }
}
  1. file-loader url-loader

file-loader 和 url-loader 都是 Webpack 的加载器(loaders),它们的作用如下:
file-loader:
描述:将文件发送到输出目录,并返回(相对)URL。
用途:通常用于处理图片、字体等文件资源。
配置:您可以通过在 Webpack 配置文件中添加 file-loader 来使用这个加载器。
url-loader:
描述:如果文件大小小于指定的大小,则将文件转换为 base64 URL,否则使用 file-loader 进行处理。
用途:通常与 file-loader 一起使用,用于处理较小的文件资源,将其转换为 base64 URL,以减少 HTTP 请求。
配置:您可以通过在 Webpack 配置文件中添加 url-loader 来使用这个加载器。
总的来说,file-loader 主要用于处理文件资源,而 url-loader 则在 file-loader 的基础上增加了对较小文件的处理能力,以减少 HTTP 请求。

const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    mode: "development",
    devtool: "source-map",
    output: {
        filename: "scripts/[name].[chunkhash:5].js"
    },
    module: {
        rules: [
            {
                test: /\.(png)|(gif)|(jpg)$/,
                use: [{
                    loader: "url-loader",
                    options: {
                        // limit: false //不限制任何大小,所有经过loader的文件进行base64编码返回
                        limit: 100 * 1024, //只要文件不超过 100*1024 字节,则使用base64编码,否则,交给file-loader进行处理
                        name: "imgs/[name].[hash:5].[ext]"
                    }
                }]
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template: "./public/index.html"
        })
    ],
    devServer: {
        open: true
    },
    stats: {
        modules: false,
        colors: true
    }
}

解决路径问题

在使用file-loader或url-loader时,可能会遇到一个非常有趣的问题
比如,通过webpack打包的目录结构如下:

dist
    |—— img
        |—— a.png  #file-loader生成的文件
    |—— scripts
        |—— main.js  #export default "img/a.png"
    |—— html
        |—— index.html #<script src="../scripts/main.js" ></script>

这种问题发生的根本原因:模块中的路径来自于某个loader或plugin,当产生路径时,loader或plugin只有相对于dist目录的路径,并不知道该路径将在哪个资源中使用,从而无法确定最终正确的路径
面对这种情况,需要依靠webpack的配置publicPath解决

const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    mode: "development",
    devtool: "source-map",
    output: {
        filename: "scripts/[name].[chunkhash:5].js",
        // publicPath: "/"  //配置关闭时,html文件里的script标签是<script defer src="../scripts/main.e5bb4.js"></script>。配置是'/'时,html文件里的script标签是<script defer src="/scripts/main.c9195.js"></script>
    },
    module: {
        rules: [
            {
                test: /\.(png)|(gif)|(jpg)$/,
                use: [{
                    loader: "file-loader",
                    options: {
                        name: "imgs/[name].[hash:5].[ext]"
                    }
                }]
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template: "./public/index.html",
            filename: "html/index.html"
        })
    ],
    devServer: {
        open: true,
        openPage: "html/index.html",
    },
    stats: {
        modules: false,
        colors: true
    }
}

在 Webpack 中,output.publicPath 是一个配置项,它用于指定在引用资源(如图片、字体等)时应该使用的公共路径。

当您在开发环境中使用 Webpack 时,通常会将资源文件(例如 CSS、JS、图片等)放在一个服务器上,并通过一个 URL 来访问这些文件。然而,如果您的资源文件和您的 HTML 文件(即入口文件)不在同一个域名下,那么浏览器可能会阻止您加载这些资源,因为它们被视为跨域请求。

为了解决这个问题,您可以使用 output.publicPath 来告诉 Webpack 在生成资源文件 URL 时应该使用什么样的公共路径。例如,如果您的资源文件放在 https://cdn.example.com/assets/ 这个 URL 下,您可以这样配置 publicPath

module.exports = {
  //...
  output: {
    publicPath: 'https://cdn.example.com/assets/',
  },
};

然后,Webpack 就会在生成资源文件 URL 时,自动为这些文件添加 publicPath 作为前缀。例如,如果 Webpack 生成了一个名为 main.js 的 JavaScript 文件,并且 publicPath 被设置为 https://cdn.example.com/assets/,那么最终生成的 URL 可能看起来像这样:https://cdn.example.com/assets/main.js

需要注意的是,publicPath 的值也可以是一个相对路径。例如,如果您的资源文件放在与 HTML 文件相同的域名下,但是位于不同的目录中,您可以这样配置 publicPath

module.exports = {
  //...
  output: {
    publicPath: '/assets/',
  },
};

在这个例子中,publicPath 被设置为 /assets/,这意味着资源文件会被放置在与 HTML 文件相同域名的根目录下的 /assets/ 目录下。

  1. 内置插件 DefinePlugin BannerPlugin ProvidePlugin

DefinePlugin 允许在 编译时 将你代码中的变量替换为其他值或表达式。这在需要根据开发模式与生产模式进行不同的操作时,非常有用。例如,如果想在开发构建中进行日志记录,而不在生产构建中进行,就可以定义一个全局常量去判断是否记录日志。这就是 DefinePlugin 的发光之处,设置好它,就可以忘掉开发环境和生产环境的构建规则。

请注意,由于本插件会直接替换文本,因此提供的值必须在字符串本身中再包含一个 实际的引号 。通常,可以使用类似 ‘“production”’ 这样的替换引号,或者直接用 JSON.stringify(‘production’)。
为每个 chunk 文件头部添加 banner。

ProvidePlugin自动加载模块,而不必导入或随处要求这些模块。

所有的webpack内置插件都作为webpack的静态属性存在的,使用下面的方式即可创建一个插件对象

const webpack = require("webpack")

new webpack.插件名(options)

DefinePlugin

全局常量定义插件,使用该插件通常定义一些常量值,例如:

new webpack.DefinePlugin({
    PI: `Math.PI`, // PI = Math.PI
    VERSION: `"1.0.0"`, // VERSION = "1.0.0"
    DOMAIN: JSON.stringify("duyi.com")
})

这样一来,在源码中,我们可以直接使用插件中提供的常量,当webpack编译完成后,会自动替换为常量的值

BannerPlugin

它可以为每个chunk生成的文件头部添加一行注释,一般用于添加作者、公司、版权等信息

new webpack.BannerPlugin({
  banner: `
  hash:[hash]
  chunkhash:[chunkhash]
  name:[name]
  author:yuanjin
  corporation:duyi
  `
})

ProvidePlugin

自动加载模块,而不必到处 import 或 require

new webpack.ProvidePlugin({
  $: 'jquery',
  _: 'lodash'
})

然后在我们任意源码中:

$('#item'); // <= 起作用
_.drop([1, 2, 3], 2); // <= 起作用

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

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

相关文章

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先&#xff0c;我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时&#xff0c;如果我们可以知道质数 x x x 在质数数组的下标 j j j&#xff0c;那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…

牛客NC279 二叉树的下一个结点【中等 二叉树中序遍历 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e 思路 思路&#xff1a;我们首先要根据给定输入中的结点指针向父级进行迭代&#xff0c; 直到找到该树的根节点&#xff1b;然后根据根节点进行中序遍历&#xff0c;当遍历到和…

Java学习第01天-Java基本内容

目录 注释 注释 单行注释 public class note {public static void main(String[] args) {// 单行注释} }多行注释 public class note {public static void main(String[] args) {/* 多行注释多行注释*/} }文档注释&#xff08;GPT生成&#xff09; /*** 计算两个整数…

webpack3升级webpack4遇到的各种问题汇总

webpack3升级webpack4遇到的各种问题汇总 问题1 var outputNamecompilation.mainTemplate.applyPluginWaterfull(asset-path,outputOptions.filename,{......)TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function解决方法 html-webpack-plugin 版…

可重构柔性装配产线:AI边缘控制技术的崭新探索

在信息化和智能化浪潮的推动下&#xff0c;制造业正面临着前所未有的转型升级挑战。其中&#xff0c;可重构柔性装配产线以其独特的AI边缘控制技术&#xff0c;为制造业的智能化转型提供了新的解决方案。 可重构柔性装配产线是基于AI工业控制与决策平台打造的智能化生产系统。…

WSL及UBUNTU及xfce4安装

如何拥有Linux服务器&#xff1f; wsl 是适用于 Linux 的 Windows 子系统&#xff08;Windows Subsystem for Linux&#xff09;。是一个为在Windows 10和Windows Server 2019上能够原生运行Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层&#xff0c;可让开发…

从车规传感器发展的正反面,看智驾发展的“胜负手”

北京车展进程过半&#xff0c;雷军和周鸿祎成为车展新晋“网红”的同时&#xff0c;智能驾驶成为观众讨论最务实的话题之一。端到端自动驾驶、城市NOA这些炙手可热的话题&#xff0c;占据了大部分的关注度。 但在高阶智能驾驶之外&#xff0c;智能驾驶同样具有频繁使用需求的低…

Leetcode—2639. 查询网格图中每一列的宽度【简单】

2024每日刷题&#xff08;121&#xff09; Leetcode—2639. 查询网格图中每一列的宽度 实现代码 class Solution { public:int func(int num) {if(num 0) {return 1;}int len 0;while(num ! 0) {len;num / 10;}return len;}vector<int> findColumnWidth(vector<ve…

实验14 MVC

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握MVC的用法。【参考课本 例1 】 三、源代码以及执行结果截图&#xff1a; example7_1.jsp&#xff1a; <% page contentType"text/html" %> <% page pageEncoding "ut…

【重磅开源】MapleBoot项目开发规范

基于SpringBootVue3开发的轻量级快速开发脚手架 &#x1f341;项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒&#xff0c;终有春日&#xff…

WEB攻防-PHP特性-piwigoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境 &#xff1a;piwigo CMS 漏洞URL&#xff1a; 漏洞文件位置&#xff1a;\include \functions_rate.inc.php 漏洞产生入口文件&#xff1a;/picture.php picture.php中接受了一个GET方法action参数&#xff0c;作为switch...case.…

spark实验求TOP值

实验1&#xff1a;求TOP值 已知存在两个文本文件&#xff0c;file1.txt和file2.txt&#xff0c;内容分别如下&#xff1a; file1.txt 1,1768,50,155 2,1218, 600,211 3,2239,788,242 4,3101,28,599 5,4899,290,129 6,3110,54,1201 7,4436,259,877 8,2369,7890,27 fil…

太速科技-基于6U CPCIe的TMS320C6678+KU060的信号处理板卡

基于6U CPCIe的TMS320C6678KU060的信号处理板卡 一、板卡概述 基于6U CPCIe的C6678KU060的信号处理板卡是新一代FPGA的高性能处理板卡。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司 XCKU060-2FFVA1156I作为主处理器&#xff0c;Xilinx 的Aritex XC7A200T作为辅助处…

Android手势识别面试问题及回答

问题 1: 如何在Android中实现基本的手势识别&#xff1f; 答案: 在Android中&#xff0c;可以通过使用GestureDetector类来实现基本的手势识别。首先需要创建一个GestureDetector的实例&#xff0c;并实现GestureDetector.OnGestureListener接口来响应各种手势事件&#xff0c…

怎么制作网站

网站制作是一项需要技术和创意的工作。这篇文章将向你介绍如何制作一个网站&#xff0c;包括网站规划、网站设计、内容编写和网站发布等方面。 首先&#xff0c;要制作一个网站&#xff0c;你需要一个域名和一个主机。域名是网站的地址&#xff0c;而主机是存储网站所有的文件和…

【GAMES 101】图形学入门——着色(Shading)

定义&#xff1a;将不同材质内容应用于不同物体对象上的过程。着色只考虑着色点的存在&#xff0c;不考虑其他物体的遮挡等&#xff0c;因此不考虑阴影处理 一些前期内容的定义&#xff1a; 着色点&#xff08;Shading Point&#xff09;观测方向&#xff08;Viewer Directio…

Winfrom —— 打印水仙花数

输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数&#xff0c;其各位数字立方之和等于该数本身。 例如&#xff0c;153是一个水仙花数&#xff0c;因为15315&#xff0b;3 解题思路&#xff1a;水仙花数的解题思路是把给出的某个三位数的个位、十位、百位分别拆分&#…

【数据结构】顺序表专题

前言 本篇文章我们来进行有关顺序表的专题训练&#xff0c;让我们一起来看一下有关顺序表的算法题 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 &#x1f4dd;若有问题 评论区见 &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 1.移除…

激光干涉仪应用拓展:透镜曲率半径测量

透镜是由透明物质&#xff08;如玻璃、水晶等&#xff09;制成的一种光学元件&#xff0c;广泛应用于安防、车载、数码相机、激光、光学仪器等各个领域。 曲率半径是透镜设计与制造的一个重要参数&#xff0c;在生产制造过程中常使用菲索型激光干涉仪通过测试干涉条纹&#xff…

面试经验分享 | 通关某公司面试靶场

0x00:探测IP 首先打开时候长这个样&#xff0c;一开始感觉是迷惑行为&#xff0c;试了试/admin&#xff0c;/login这些发现都没有 随后F12查看网络&#xff0c;看到几个js文件带有传参&#xff0c;就丢sqlmap跑了一下无果 随后也反查了域名一下&#xff0c;发现没有域名&#…