Webpack常见插件和模式

目录


目录

  • 目录
    • 认识 Plugin
      • CleanWebpackPlugin
      • HtmlWebpackPlugin
        • 自定义模版
      • DefinePlugin的介绍 ( 持续更新 )
        • Mode 配置


认识 Plugin

Loader是用于特定的模块类型进行转换;
Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等

CleanWebpackPlugin

前面我们演示的过程中,每次修改了一些配置,重新打包时,都需要手动删除dist文件夹:
我们可以借助于一个插件来帮助我们完成,这个插件就是CleanWebpackPlugin;
CleanWebpackPlugin 是一个用于清理/dist文件夹中所有文件的插件,除了被Webpack创建的文件。
以下是配置 CleanWebpackPlugin 的步骤:

  1. 首先,需要安装 CleanWebpackPlugin 插件,可以通过 npm 进行安装:
npm install clean-webpack-plugin --save-dev
  1. 然后,在 webpack 配置文件中引入该插件:
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
  1. 最后,在 webpack 配置文件的 plugins 部分使用该插件:
module.exports = {
  // ...
  plugins: [
    new CleanWebpackPlugin(),
    // ...
  ],
  // ...
};

这样,每次运行 webpack 时,/dist 文件夹中的所有旧文件都会被清理,只留下由 webpack 创建的新文件。这有助于确保每次构建都是从干净的状态开始,避免旧文件对新构建造成影响。

HtmlWebpackPlugin

自定义 HTML 模版
自定义模板数据填充

HtmlWebpackPlugin 的用法是在 webpack 配置中引入插件,并在 plugins 选项中使用它。基本用法是创建一个新的 HTML 文件,并自动将打包好的 JavaScript 和 CSS 文件注入到这个 HTML 文件中

在 webpack 配置文件中,可以通过以下步骤使用 HtmlWebpackPlugin:

  1. 安装插件:首先需要通过 npm 安装 html-webpack-plugin 插件到项目的开发依赖中,使用命令 npm install --save-dev html-webpack-plugin
  2. 引入插件:在 webpack 配置文件中,使用 const HtmlWebpackPlugin = require('html-webpack-plugin'); 引入插件。
  3. 配置插件:在 webpack 配置的 plugins 数组中添加一个新的 HtmlWebpackPlugin 实例。例如:new HtmlWebpackPlugin({})。这个插件支持多种选项,如 template(指定模板文件)、inject(指定输出文件的注入位置)、filename(指定输出文件名)等。
  4. 多次引用:如果需要生成多个 HTML 文件,可以在 plugins 数组中多次引用 HtmlWebpackPlugin,每次引用时可以设置不同的选项来定制每个 HTML 文件的内容和行为。

HtmlWebpackPlugin 的配置通常包括以下内容:

  1. 模板文件:通过 template 选项指定用于创建 HTML 文件的模板。这可以是一个简单的 HTML 字符串,一个包含占位符的 lodash 模板,或者是一个自定义的 loader。
  2. 注入位置:通过 inject 选项指定将打包好的资源文件(如 JavaScript、CSS)注入到 HTML 文件的哪个部分。常见的值有 'body''head'
  3. 输出文件名:通过 filename 选项指定生成的 HTML 文件的名称和路径。这与 webpack 配置中的 output.filename 类似,但 HtmlWebpackPlugin 允许指定路径。
  4. 包含/排除模块:通过 chunksexcludeChunks 选项分别指定要包含或排除的模块。这对于控制哪些模块被打包进最终的 HTML 文件非常有用。
  5. 压缩 HTML:通过 minify 选项可以对生成的 HTML 文件进行压缩,以提高加载速度和性能。minify 的值是一个对象,可以包含多种压缩选项。

综上所述,HtmlWebpackPlugin 是一个非常实用的 webpack 插件,它简化了 HTML 文件的创建和管理过程,特别是对于那些需要处理复杂构建和哈希值变化的场景。通过合理配置,它可以大大提高前端项目的构建效率和可靠性。

以下是一个使用 HtmlWebpackPlugin 的详细 webpack 配置文件示例:

// webpack.config.js
const path = require('path');
// 导入
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  // 入口文件
  entry: './src/index.js',

  // 输出配置
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js',
    clean: true,
  },

  // 模块配置(此处省略,可能包含加载器配置等)
  module: {},

  // 插件配置
  plugins: [
    // 使用 HtmlWebpackPlugin 创建一个新的 HTML 文件,自动注入所有生成的 bundle.js 和 style.css
    new HtmlWebpackPlugin({
      title: 'My App', // HTML 标题
      template: path.join(__dirname, 'src', 'module.html'), // 模板文件路径
      inject: 'body', // 将资源文件注入到 body 底部
      filename: 'index.html', // 输出文件名
      // 指定需要引入的 chunks,例如不引入第三方库 axios
      chunks: ['app'],
      // 排除某些 chunks,例如不引入 manifest.json
      excludeChunks: ['manifest'],
      // 根据模板中的标记进行替换,如 <%= htmlWebpackPlugin.files.js.map %>
      files: {
        css: ['style.css'],
        js: ['main.js'],
      },
      // 压缩 HTML 文件
      minify: {
        collapseWhitespace: true,
        removeComments: true,
        removeRedundantAttributes: true,
        removeScriptTypeAttributes: true,
        removeStyleLinkTypeAttributes: true,
        useShortDoctype: true,
      },
      // 其他选项...
    }),
  ],
};

在这个配置文件中,我们做了以下操作:

  1. 入口 (entry): 定义了应用的入口点为 './src/index.js'
  2. 输出 (output): 定义了打包后的文件存放目录为项目的 'dist' 目录,并设置了文件名包含内容哈希值 [contenthash],以便在文件内容改变时能够更新文件名。
  3. 模块 (module): 这里省略了详细的加载器配置,通常你会根据项目需求添加样式、图片等资源文件的加载器。
  4. 插件 (plugins): 使用了 HtmlWebpackPlugin 插件,并进行了详细的配置。

HtmlWebpackPlugin 的配置项包括:

  • title: 设置 HTML 文档的标题。
  • template: 指定使用的模板文件路径,该文件会被作为新生成的 HTML 文件的基础。
  • inject: 设置资源文件应该被注入到 HTML 文件的哪个位置,可选值有 'body' (默认) 或 'head'
  • filename: 设置生成的 HTML 文件的名称。
  • chunks: 指定哪些入口 chunk 需要被包含在 HTML 文件中,可以通过函数进行更细粒度的控制。
  • excludeChunks: 指定哪些入口 chunk 需要被排除。
  • files: 一个对象,其键是文件类型,值是与这些类型相关的文件名列表。这允许你通过模板中的占位符动态替换文件。
  • minify: 一个对象,包含是否压缩 HTML 以及如何压缩的各种选项。
  • other options: HtmlWebpackPlugin 支持很多其他选项,可以进一步自定义插件行为。

请注意,这个配置文件只是一个示例,实际项目中你可能需要根据项目的具体需求对配置进行调整。

自定义模版

HtmlWebpackPlugin 中,你可以使用自定义的 HTML 模板来满足这些需求。

首先,你需要创建一个包含你想要添加的内容的 HTML 文件。例如,假设你有一个名为 my-template.html 的文件,其中包含以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
    <noscript>
        <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- 其他内容 -->
</body>
</html>

在这个文件中,我们使用了占位符 <%= htmlWebpackPlugin.options.title %> 来动态替换标题。这个占位符将在生成的 HTML 文件中被实际值替换。

接下来,在你的 webpack.config.js 文件中,你需要将 template 选项设置为你的自定义模板文件的路径。例如:

new HtmlWebpackPlugin({
    template: path.join(__dirname, 'src', 'my-template.html'), // 设置自定义模板文件路径
    // 其他配置项...
}),

这样,当你运行 webpack 时,它将使用你的自定义模板文件来创建新的 HTML 文件,并将占位符替换为实际值。

请注意,如果你需要在多个页面中使用相同的模板,你可以在 HtmlWebpackPlugin 实例中重复使用相同的模板文件路径。

DefinePlugin的介绍 ( 持续更新 )

在这里插入图片描述
直接运行会报错, 没有BASE_URL

在JavaScript中,可以使用DefinePlugin插件来注入变量。首先需要安装webpackhtml-webpack-plugin,然后在webpack.config.js文件中进行配置。以下是具体的操作步骤:

  1. 安装webpackhtml-webpack-plugin
npm install --save-dev webpack html-webpack-plugin
  1. 在项目根目录下创建一个名为webpack.config.js的文件,并添加以下内容:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
  ],
};
  1. src目录下创建一个名为index.html的文件,并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app"></div>
  <script src="bundle.js"></script>
</body>
</html>
  1. 修改src/index.html中的<link>标签,使用DefinePlugin定义的常量:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <% if (BASE_URL) { %>
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <% } %>
</head>
<body>
  <div id="app"></div>
  <script src="bundle.js"></script>
</body>
</html>
  1. webpack.config.js中添加DefinePlugin配置:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { DefinePlugin } = require('webpack');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
    new DefinePlugin({
      'BASE_URL': JSON.stringify('https://example.com/'),
    }),
  ],
};

现在,当你运行webpack时,<link>标签中的href属性将使用definePlugin定义的BASE_URL常量,不再报错。

Mode 配置

Mode配置选项,可以告知webpack使用相应模式的内置优化:
 默认值是production(什么都不设置的情况下);
 可选值有:‘none’ | ‘development’ | ‘production’;
例子
在Webpack中,mode是一个配置选项,用于指定构建的模式。它决定了Webpack的优化和打包策略。默认情况下,Webpack提供了两种模式:developmentproduction

如果你想使用DefinePlugin来设置环境变量,并且希望根据不同的模式进行配置,你可以将mode添加到你的配置文件中。以下是一个示例:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { DefinePlugin } = require('webpack');

module.exports = (env, options) => {
  const isProduction = options.mode === 'production';

  return {
    entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist'),
    },
    plugins: [
      new HtmlWebpackPlugin({
        template: './src/index.html',
      }),
      new DefinePlugin({
        'process.env': {
          NODE_ENV: JSON.stringify(isProduction ? 'production' : 'development'), // 根据模式设置环境变量
        },
      }),
    ],
  };
};

在上面的示例中,我们使用了函数形式的配置,并接收了两个参数:envoptionsoptions.mode表示当前的构建模式。通过检查options.mode的值,我们可以确定当前是生产模式还是开发模式,并根据需要设置环境变量。
这样,当你运行Webpack构建时,根据不同的模式,process.env.NODE_ENV将被设置为'production''development'

Mode 配置代表更多
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年财报大揭秘:下一个倒闭的新势力呼之欲出

3月25日&#xff0c;零跑汽车公布了他们2023年的财报。财报数据显示&#xff0c;零跑亏损了42亿元。恰逢近段时间众多新势力车企皆公布了年报&#xff0c;而亏损也成了大家避不开的话题。那今天就让我们一起盘点一下各个车企的财报吧&#xff01; 2023年财报大揭秘&#xff1a;…

12.路由安装

路由安装 安装vscode https://code.visualstudio.com/ 使用vscode打开后台系统项目 在终端运行npm run dev即可运行项目 src/assets中存放静态资源 src/components中存放组件 app.vue是主界面&#xff08;入口页面&#xff09; 注释main.ts中的import ./style.css package.j…

以syslog形式推送告警信息到UMP平台--主要为接口思路

背景 客户需求&#xff0c;根据当前时间获取到的接口返回值中的关键字段的数值进行判断&#xff0c;当超过阈值时推送可恢复告警&#xff0c;推送一次即可&#xff0c;待数据正常时推送告警恢复&#xff0c;工作日8点到18点执行。【代码还在整理中】 问题分析 告警通知&…

“光学行业正被量子颠覆”——行业巨头齐聚,展示量子成果

OFC是全球最大的光网络和通信盛会&#xff0c;代表一系列产品&#xff0c;从光学元件和设备到系统、测试设备、软件和特种光纤&#xff0c;代表整个供应链&#xff0c;并提供业界学习、连接、建立网络和达成交易的首要市场&#xff0c;于2024年3月24日至28日在圣地亚哥会议中心…

Redis入门到实战-第二十二弹

Redis入门到实战 Redis高可用Sentinel官网地址Redis概述虚拟机配置在主从复制环境的基础上添加Sentinel更新计划 Redis高可用Sentinel 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一…

Sentinel原理及实践

Sentinel 是什么 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 为什么使用sentinel&…

[flume$1]记录一个启动flume配置的错误

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDeliveryException: Failed to open…

Android TargetSdkVersion 30 安装失败 resources.arsc 需要对齐且不压缩。

公司项目&#xff0c;之前targetSDKVersion一直是29&#xff0c;近期小米平台上架强制要求升到30&#xff0c;但是这个版本在android12上安装失败&#xff0c;我用adb命令安装&#xff0c;报错如下图 adb: failed to install c: Program Files (x86)(0A_knight\MorkSpace \Home…

Python中模块

基本概念 **模块 module&#xff1a;**一般情况下&#xff0c;是一个以.py为后缀的文件 ①Python内置的模块&#xff08;标准库&#xff09;&#xff1b; ②第三方模块&#xff1b; ③自定义模块。 包 package&#xff1a; 当一个文件夹下有 init .py时&#xff0c;意为该文…

腾讯 tengine 替代 nginx

下载地址 变更列表 - The Tengine Web Server 解压 tar -xvf 安装包.gz 进入到解压目录 cd 解压目录 使用 ./configure 命令来指定安装目录,这边指定安装到 /opt/tengine/install路径下 新建install目录 ./configure --prefix/opt/tengine/install 检查是否有缺失的依…

#编程那么容易学会吗?#

没有学过编程的人&#xff0c;这个问题可能没个底&#xff1f; 师傅领进门,修行靠自身。其实编程不难&#xff0c;关键是你能找一个好老师&#xff0c;他愿意教你。 如果靠你自己摸索的话&#xff0c;估计你会浪费很多的时间&#xff0c;所以现在网络上一大堆的专家&#xff0c…

基于vue的MOBA类游戏攻略分享平台的设计与实现|Springboot+Vue+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

五种免费的Python开发环境及具体下载网址

五种免费的Python开发环境及具体下载网址 目录 五种免费的Python开发环境及具体下载网址1.Anaconda2.PyCharm Community Edition3.Visual Studio Code4.Jupyter Notebook5. WinPython Python编程可选择不同的开发工具环境进行&#xff0c;本文介绍五种常用的&#xff0c;读者可…

【MySQL】数据库--表操作

目录 一、创建表 二、查看表 三、修改表 1. 添加字段--add 2.修改表名--rename to 3.修改列名--change 4.修改字段的数据类型--modify 5.删除字段&#xff08;列&#xff09;--drop 四、删除表 一、创建表 create [temporary]table[if not exists]table_name [([colu…

阿里云服务器一年多少钱?2024最新活动价格表整理与分享

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

Turborepo 1.13 发布!新终端 UI 与本地任务交互

近日&#xff0c;Turborepo 1.13 带来了全新改进的本地开发体验以及其他增强功能&#xff0c;包括 新终端 UI&#xff1a;在增强的终端体验中与本地任务交互启用最快的默认设置&#xff1a;使用 turbo scan 让本地开发环境更快CI 日志改进&#xff1a;支持四个主要提供商并自动…

springcloud基本使用(搭建eureka服务端)

创建springbootmaven项目 next next finish创建成功 删除项目下所有文件目录,只保留pox.xml文件 父项目中的依赖: springboot依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s

HTTP,Servlet

HTTP 概念&#xff1a;HyperTextTransferProtocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 HTTP协议特点&#xff1a; 1.基于TCP协议&#xff1a;面向连接&#xff0c;安全 2.基于请求-响应模型的&#xff1a;一次请求对应一次响应 …

day69实现MyBatis 的Mapper接口 封装SqlSession对象 mapper接口形参怎么给占位符赋值

一 创建项目的准备工作 1 添加jar包 MySql.jar .MyBatis.jar 2 在src中配置MyBatis.xml文件 二 封装SqlSession对象 1 SqlSessionFactoryBuilder 生命周期 这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后…

CY3.5-COOH热稳定性Cyanine3.5-COOH星戈瑞

CY3.5-COOH的热稳定性是评估其性能和应用的指标之一。在实际应用中&#xff0c;特别是在高温环境下&#xff0c;热稳定性决定了染料能否保持其原有的物理化学性质&#xff0c;从而确保实验结果的准确性和可靠性。 研究表明&#xff0c;CY3.5-COOH花菁染料羧基科研试剂具有较高…