04-插件机制,横向扩展Webpack构建能力

Webpack 插件机制的目的是为了增强 Webpack 在项目自动化构建方面的能力。

上一节,Loader负责完成项目中各样资源的加载,从而实现项目整体模块化。
这一节,Plugin能力更广,负责解决除了资源模块打包外的其他自动化工作;

我在这里先介绍几个插件最常见的应用场景:

  • 实现自动在打包之前清除 dist 目录(上次的打包结果);
  • 自动生成应用所需要的 HTML 文件;
  • 根据不同环境为代码注入类似 API 地址这种可能变化的部分;
  • 拷贝不需要参与打包的资源文件到输出目录;
  • 压缩 Webpack 打包完成后输出的文件;
  • 自动发布打包结果到服务器实现自动部署。

总之,有了Plugin,Webpack几乎’无所不能’,借助插件我们可以轻松实现前端工程化中的绝大多数功能,使得很多初学者把Webpack和前端工程化混淆;

接下来计划先通过一些常用插件的使用,了解Plugin机制,
再通过自己开发一个插件,理解Plugin原理;


常用插件:

1、clean-webpack-plugin,自动清除输出目录的插件

通过之前的尝试,我们发现webpack每次打包的结果就是直接覆盖到dist目录。但dist目录中可能存在一些在上次打包操作时遗留的文件,此时会出现一些已经移除的文件还冗余其中的情况,最终导致线上部署的时候出现多余文件,这显然很不合理;

更合理的做法就是,每次打包前清理一遍dist目录,保证实时性,每次都是最新的;

clean-webpack-plugin插件就实现了这个需求,它是个第三方npm包,用前需要安装下:

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

此时执行打包之后,dist文件会被清空,然后重新生成打包文件;

P.S. 报错:如果output不配置path的话,会报错clean-webpack-plugin: options.output.path not defined. Plugin disabled...

解决:在output中声明path属性如下图,或者选择clean属性配置(webpack新版本的替代解决方案)

webpack 5.20.0升级后,output.clean选项可以再打包之前清理输出目录;已经替代了这个插件的作用


2、 html-webpack-plugin,用于生成 HTML 的插件

首先,我们要知道html文件,一般都是通过硬编码的方式,单独存放在项目根目录中。此时会有问题:项目发布时,我们同时要发布根目录下的html+dist里的所有打包文件,还要确保上线后html代码中的资源文件路径正确,非常麻烦;如果打包结果输出的目录或者文件名发生变化,html代码中所对应的script标签也需要我们手动修改;

解决这个问题最好的办法就是让webpack在打包的同时,自动生成对应的html文件,让webpack将打包的bundle文件自动引入页面中;此时需要html-webpack-plugin

$ npm install html-webpack-plugin --save-dev

安装后,返回配置文件。引入并在plugin属性中添加这个类型的实例对象,完成插件使用;

17行,引入插件对象

此时打包后,会在dist中自动生成一个使用了bundle.js的空白html文件

image.png

至此,webpack可以动态生成应用所需的html文件了,但是仍需要有些改动的地方:

  • 对于生成的html文件,页面title必须要改;

  • 还需要自定义页面的meta标签和一些基础的DOM结构

即少量修改靠配置项,大量修改靠模版

简单的修改,通过在HtmlWebpackPlugin对象中修改参数:

如果是大量的自定义,最好的做法是在源代码中添加一个用于生成html的模版,然后让这个插件根据模版去生成页面;

在src文件夹下新建一个html文件,然后根据我们的需要在这个文件中添加相应的元素。对于模板中动态的内容,可以使用 Lodash 模板语法输出,模板中可以通过 htmlWebpackPlugin.options 访问这个插件的配置数据,例如我们这里输出配置中的 title 属性,具体代码如下:

有了模版文件之后,在webpack.config.js里修改对应配置属性

template属性,配置模版文件地址

此时再打包文件,生成的html就是根据模版内容产生的文件了

关于 html-webpack-plugin 插件,除了自定义输出文件的内容,同时输出多个 HTML 文件也是一个非常常见的需求,除非我们的应用是一个单页应用程序,否则一定需要输出多个 HTML 文件。

如果需要同时输出多个 HTML 文件,其实也非常简单,我们回到配置文件中,这里通过 HtmlWebpackPlugin 创建的对象就是用于生成 index.html 的,那我们完全可以再创建一个新的实例对象,用于创建额外的 HTML 文件。

例如,这里我们再来添加一个 HtmlWebpackPlugin 实例用于创建一个 about.html 的页面文件,我们需要通过 filename 指定输出文件名,这个属性的默认值是 index.html,我们把它设置为 about.html,具体配置如下:

多个插件对象,生成多个文件

完成以后我们再次回到命令行终端,运行打包命令,然后我们展开 dist 目录,此时 dist 目录中就同时生成了 index.html 和 about.html 两个页面文件。

根据这个尝试我们就应该知道,如果需要创建多个页面,就需要在插件列表中加入多个 HtmlWebpackPlugin 的实例对象,让每个对象负责一个页面文件的生成。


下一节,我们手写一个Loader加载器和Plugin插件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容