服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - Webpack原理与实践:webpack如何利用插件机制横向扩展构建能力?

Webpack原理与实践:webpack如何利用插件机制横向扩展构建能力?

2021-12-19 22:53前端万有引力一川 编程技术

简单了解了几个常用的插件,一般适合用于任何类型的项目,不管是否使用了框架。webpack为每个工作环节都预留了合适的钩子,扩展时只需要找到合适的时机去做合适的事情。

Webpack原理与实践:webpack如何利用插件机制横向扩展构建能力?

写在前面

webpack插件机制的目的是:为了增强webpack在项目自动化构建方面的能力。插件最常见的应用场景是:

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

插件机制

webpack每次打包的结果都是直接覆盖到dist目录,打包前,dist目录中可能已经存在上一次打包操作时遗留的文件,再次打包时,只能覆盖掉同名文件,已经移除的资源文件会一直累积在里面,最终导致部署上线时出现多余文件。很明显这是不合理的。

更好的做法当然是:在每次完整打包浅,自动明清理dist目录,每次打包过后,dist目录中就只会存在那些必要的文件。我们可以依赖第三方npm包:clean-webpack-plugin。安装后回到webpack的配置文件中,导入clean-webpack-plugin插件,该插件模块导出CleanWebpackPlugin。

  1. //webpack.config.js
  2. const path = require("path")
  3. const {CleanWebpackPlugin} = require("clean-webpack-plugin")
  4. module.exports = {
  5. entry:"./src/index.js",
  6. output:{
  7. filename:"bundle.js",
  8. },
  9. mode:"none",
  10. plugins:[
  11. new CleanWebpackPlugin()
  12. ]
  13. }
  1. // src/index.js
  2. console.log("nihao nihao");

打包压缩后的代码:

  1. /******/ (() => { // webpackBootstrap
  2. var __webpack_exports__ = {};
  3. console.log("nihao nihao");
  4. /******/ })()
  5. ;

我们知道html文件一般都是通过硬编码的方式,单独存放在项目的根目录下,这种方式有两个问题:

  • 项目发布时,我们需要同时发布根目录下的html文件和dist目录中所有打包的打包结果,非常麻烦,而且上线后还要确保html代码中的资源文件正确
  • 如果打包结果输出的目录或文件名发生变化,那么html代码中对应的script标签需要我们手动修改路径

为此webpack也有相关的插件自动生成html,相对于之前写死html文件的方式,自动生成html的优势在于:

  • html也输出到dist目录中,上线时只需要把dist目录发布出去
  • html中的script标签是自动引入的,所以可以确保资源文件的路径是正常的

安装后回到配置文件,载入此模块,相对于clean-webpack-plugin需要解构内部成员所不同,html-webpack-olugin插件默认导出的就是插件类型。

对于生成的html文件,页面的title需要修改,许多时候还需要我们自定义页面的一些meta标签和基础dom结构。

  1. const path = require("path")
  2. const {CleanWebpackPlugin} = require("clean-webpack-plugin")
  3. const HtmlWebpackPlugin = require("html-webpack-plugin")
  4. module.exports = {
  5. entry:"./src/index.js",
  6. output:{
  7. filename:"bundle.js",
  8. },
  9. mode:"none",
  10. plugins:[
  11. new CleanWebpackPlugin(),
  12. new HtmlWebpackPlugin({
  13. title:"hello webpack",
  14. template:"./src/index.html"
  15. })
  16. ]
  17. }

指定要打包的html文件:

  1. "en">
  2. "UTF-8">
  3. "X-UA-Compatible" content="IE=edge">
  4. name="viewport" content="width=device-width, initial-scale=1.0">
  5. "container">
  6. 页面结构

  7. "root">

这样就自动生成了一个html文件:

  1. "en">
  2. "UTF-8">
  3. "X-UA-Compatible" content="IE=edge">
  4. name="viewport" content="width=device-width, initial-scale=1.0">
  5. "container">
  6. 页面结构

  7. "root">

html-webpack-olugin除了可以自定义输出文件内容,同时还可以输出多个html文件,通过HtmlWebpackPlugin创建的对象是用于生成index.html文件的,玩去哪可以再创建一个新的实例对象,用于创建额外的html文件。

对于项目中一些不需要参与构建的静态文件如:网站的favicon、robots.txt文件等,但是需要发布在线上。那么可以将这类文件统一放在根目录下的public或static目录中,希望webpack在打包时一并将这个目录下所有的文件复制到输出目录,这种需求可以使用copy-webpack-plugin插件的实现。

  1. plugins:[
  2. new CleanWebpackPlugin(),
  3. new HtmlWebpackPlugin({
  4. title:"hello webpack",
  5. template:"./src/index.html"
  6. }),
  7. new CopyWebpackPlugin([
  8. "public"//需要拷贝的目录或者路径
  9. ])
  10. ]

参考文章

  • 《webpack原理与实践》
  • 《webpack中文文档》

写在最后

简单了解了几个常用的插件,一般适合用于任何类型的项目,不管是否使用了框架。webpack为每个工作环节都预留了合适的钩子,扩展时只需要找到合适的时机去做合适的事情。

原文链接:https://mp.weixin.qq.com/s/5ls_GQji0VLau0vg65yxtw

延伸 · 阅读

精彩推荐
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5232021-06-21
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5972021-03-08