前面文章中 体验了webpack的打包解析css资源处理图片字体等文件 接下来看看 plugins 有什么作用吧~

项目路径如下,和上一篇 处理图片字体等文件 项目保持一致

demo
├─ src
│ ├─ css
│ │ ├─ index.css
│ │ └─ file.css
│ ├─ img
│ │ ├─ portrait.png
│ │ └─ sky.jpg
│ ├─ js
│ │ ├─ component.js
│ │ └─ createElement.js
│ └─ index.js
├─ index.html
├─ package.json
└─ webpack.config.js

clean-webpack-plugin

我们通过 npm run build 来生成打包后文件夹 dist ,但每次打包后是删除 dist 重新创建文件夹,还是仅覆盖同名文件呢?

答案是:仅覆盖同名文件

我们在 dist 文件夹中新建一个 hello.txt 文件,再通过 npm run build 重新编译,发现 hello.txt 文件仍然存在,也就是说 dist 文件夹没有被删除和重新创建

如果在 webpack.config.js 文件中修改配置,打包后文件名发生变化,打包文件夹不被删除,只会覆盖同名文件,会导致文件夹越来越大,除了每次手动删除,还可以使用 clean-webpack-plugin。

通过 npm i clean-webpack-plugin -D 安装依赖,在 webpack.config.js 中配置 plugin

const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  // 其它配置省略
  plugins: [new CleanWebpackPlugin()],
};

再次通过 npm run build 编译,发现我们创建的 hello.txt 文件就已经被删除,已经可以通过 plugin 自动删除 dist 文件夹啦~

html-webpack-plugin

目前用于查看打包结果的方式是,通过项目根目录下的 index.html 文件,引入编译后的 js 文件,但这种方式存在两个问题。

  • 当 js 文件非常多时,需要一个个引入,可能有遗漏
  • 在发布线上的时候,编译后的 dist 文件夹作为静态资源,里面需要有 index.html 作为入口文件,而手动将根目录下的 index.html 移动过去,可能需要修改大量的文件路径

html-webpack-plugin 提供了自动生成 html 文件并引入资源的功能,可以解决以上问题

通过 npm install html-webpack-plugin -D 安装依赖,并在 webpack.config.js 中配置

const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  // 其它配置省略
  plugins: [
    new HtmlWebpackPlugin({
      // 自定义 index.html 的 title
      title: "hello webpack",
    }),
  ],
};

编译后入口文件 bundle.js 会被自动引入到 index.html 中

html-webpack-plugin 中 ejs 文件就是用于生成 html 的模板

但比如 vue、react 的入口 index.html 文件中需要添加 id 为 app 或者 root 的 div 标签,使用默认的 html 模板就不合适了,html-webpack-plugin 提供了自定义模板文件的选项。

将 vue 中位于 public 文件夹下 index.html 的模板文件复制过来

在 webpack.config.js 中配置自定义模板文件

module.exports = {
  // 其它配置省略
  plugins: [
    new HtmlWebpackPlugin({
      // 自定义 index.html 的 title
      title: "hello webpack",
      template: "./public/index.html",
    }),
  ],
};

再通过 npm run build 编译,但此时报错,BASE_URL is not defined

这里BASE_URL需要配置全局变量,要使用下面这个 plugin

DefinePlugin

DefinePlugin 存在于 webpck 的包中,不需要单独安装

const { DefinePlugin } = require("webpack");

module.exports = {
  // 其它配置省略
  plugins: [
    new HtmlWebpackPlugin({
      // 自定义 index.html 的 title
      title: "hello webpack",
      template: "./public/index.html",
    }),
    new DefinePlugin({
      // 双引号里的内容会被拿出来作为一个变量,所以 ./ 外面还要加一层引号
      BASE_URL: "'./'",
    }),
  ],
};

再次运行 npm run build,index.html 就可以通过模板生成啦

copy-webpack-plugin

在上面的 html 页面中引入了一个 favicon.ico,用于展示在网页左上角的图标,这个icon 在 vue/react 项目中是放置在 public 目录下,我们也在 public 目录下放置一个 icon,用于展示。

因为 public 文件下的资源是固定的,直接拷贝到编译后的文件夹引入使用就可以,这里使用 copy-webpack-plugin 来操作。

通过 npm i copy-webpack-plugin -D 安装后,在 webpack.config.js 中配置。

const CopyWebpackPlugin = require("copy-webpack-plugin");

module.exports = {
  // 其它配置省略
  plugins: [
    new HtmlWebpackPlugin({
      // 自定义 index.html 的 title
      title: "hello webpack",
      template: "./public/index.html",
    }),
    new DefinePlugin({
      // 双引号里的内容会被拿出来作为一个变量,所以 ./ 外面还要加一层引号
      BASE_URL: "'./'",
    }),
    new CopyWebpackPlugin({
      // 用于匹配复制文件的规则
      patterns: [
        {
          from: "public",
        },
      ],
    }),
  ],
};

只配置复制文件来源是不够的,因为HtmlWebpackPlugin已经处理了一次html,会报错index.html文件冲突

在上面的 patterns 中需要加上忽略文件的配置

patterns: [
  {
    from: "public",
    globOptions: {
      // 忽略的文件如果在from属性配置的文件夹下,需要在文件名前加上 **/
      ignore: ["**/index.html"],
    },
  },
];

再次运行 npm run build,图标就已经被复制到 dist 文件夹下,网页左上角也能成功显示

以上通过 clean-webpack-plugin 自动删除编译后文件夹、html-webpack-plugin 配置 html 模板、definePlugin 定义全局变量、copy-webpack-plugin 复制 public 下静态资源,使项目资源处理更为简单。

更多有关webpack的内容可以参考我其它的博文,持续更新中~

看,这些 plugins 常用又简单的更多相关文章

  1. Maven常用插件简单配置

    好久不见,甚是想念.一日不见,如隔三秋. 从春节到现在已经很久没有回归博客园了,今天回来温习一下maven常用的一些插件的配置,学东西一个很简单的诀窍就是重复重复再重复,这样一定能把知识掌握的很牢靠. ...

  2. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  3. linux常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)

    1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...

  4. iOS Foundation框架 -2.常用集合类简单总结

    Foundation框架中常用的类有:NSString.NSArray.NSSet.NSDictionary 以及它们对应的子类 NSMutableString.NSMutableArray.NSMu ...

  5. iOS性能检测之Instrunments - 几种常用工具简单介绍

    Instrunments:  没错,就是这货,很多人平时开发可能不一定会用到这个,但我要说的是,学会使用它,会让你加分不少哦 先来一张全家福: 1.打开方式 或者 两种方式都行. 2.今天主要介绍一下 ...

  6. Linux_常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)

    1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...

  7. bitset常用用法&&简单题分析

    Preface bitset,还是一个比较好用的STL,可以给一些题目做到神奇的常数优化(\(O(\frac{原来的复杂度}{机器的位数(32位or64位)})\)) 关于一些具体的函数等内容可以参考 ...

  8. jquery常用写法简单记录

    好久不写东西了......话不多说,主要记录一下,最近做的项目中用到的js的记录(虽然特别特别简单) 一 jquery常用写法记录 jQuery(this).addClass("select ...

  9. scoket常用函数简单介绍

    scoket:   是一种抽象层,应用程序通过它来发送和接收数据,使用socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信. 简单来说,scoket提供了程序内部与外界通道的 ...

  10. android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件

    主要参考<第一行代码> 1.TextView: 功能与传统的桌面应用开发中的Label控件相似,用于显示文本信息 如: <TextView android:layout_width= ...

随机推荐

  1. 音视频八股文(8)-- h264 AnnexB

    NALU(Network Abstract Layer Unit) ⾳视频编码在流媒体和⽹络领域占有重要地位:流媒体编解码流程⼤致如下图所示: H264简介 H.264从1999年开始,到2003年形 ...

  2. 音视频八股文(5)--SDL音视频渲染实战。会使用就行,不需要深究。

    01-SDL子系统 SDL将功能分成下列数个子系统(subsystem): SDL_INIT_TIMER:定时器 SDL_INIT_AUDIO:音频 SDL_INIT_VIDEO:视频 SDL_INI ...

  3. 2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选

    2022-03-09:我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字. 你来猜我选了哪个数字. 如果你猜到正确的数字,就会 赢得游戏 . 如果你猜错了,那么我会告诉你,我选 ...

  4. 【GiraKoo】面向对象开发系列之【封装】

    [技术分享]面向对象开发系列之[封装] 理解 封装是面向对象程序开发的基石. 程序开发,最核心价值,是数据. 程序其实是读取数据,操作数据,保存数据等一系列操作. 那么经过良好组织过的数据,将使编程事 ...

  5. Windows与网络基础

    Windows 基础命令 一.目录和文件的应用操作 1.cd命令 cd /d d:\ //切换到d盘目录,因为改变了驱动器,所以要加上/d选项 cd c:\ //如果没有改变驱动器号,就不需要加/d选 ...

  6. Request header field userRole is not allowed by Access-Control-Allow-Headers in preflight response.

    今使用axios 请求数据过程中遇到同事设置的请求头,在我请求的接口中部不被允许,于是老是提示Request header field userRole is not allowed by Acces ...

  7. MAC 打开.bash_profile

    1.开启终端(terminal)[左下角启动台(图标)> 其他] 2.进入当前用户目录 $ cd ~ 3.打开profile文件 $ open -e .bash_profile 就会弹出.bas ...

  8. 谷歌语法Github及利用方式

    0x01简介 GoogleHack(谷歌语法)是指使用Google等搜索引擎对某些特定的网络主机漏洞(通常是服务器上的脚本漏洞)进行搜索,以达到快速找到漏洞主机或特定主机的漏洞的目的.比如使用搜索包含 ...

  9. Java的Atomic原子类

    Java SDK 并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并且每个类别都有若干原子类. 对基本数据类型的变量值进行原子更新: 对对象变量的指向进行原子 ...

  10. 代码随想录算法训练营Day8字符串|●  344.反转字符串  541. 反转字符串II  剑指Offer 05.替换空格  151.翻转字符串里的单词  剑指Offer58-II.左旋转字符串

    344.反转字符串 题目连接:344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,__你必须原地修改输入数组.使用 ...