美文网首页
webpack plugn 插件原理

webpack plugn 插件原理

作者: littleyu | 来源:发表于2021-05-06 12:01 被阅读0次

从上文提炼出 webpack 的一些主要流程

init => run(前两个一般不用) => compile(编译开始的时候) => compilation(准备编译的整个过程) => make(开始编译) => afterCompile(编译结束) => seal(对代码进行封装,比如优化、合并...) => codeGenerate(生成代码) => emit(发射,把文件写到硬盘里面) => done

插件,就是找个地方插进去

比如:imagemin-webpack-pluginclean-webpack-plugin

imagemin-webpack-plugin

  • 这是一个压缩图片的插件
  • 文件目录非常简单
  • 主要看 apply 这个函数
  • 根据看源码的步骤,跳过声明
  • 直接看最后的 if else,因为我们一般使用的是 webpack 4 以上的版本,所以进入 compiler.hooks 分支(见代码备注)
  • 发现他监听了 emit 这个事件
  • 直接看函数名字我们就能知道他的主要功能(优化项目中图片和其他外部图片)
  • 对 compilation.assets (此次编译的文件)进行 map 操作,用 testFunction 判断是否是图片文件,然后执行 optimizeImage 这个方法进行图片优化(这里用到了 imagemin 这个库)

这个插件非常简单

clean-webpack-plugin

  • 这是一个清理 webpack 的输出目录的插件
  • 分析这个插件之前,我们先思考如果我们要写这个插件,我们应该监听哪个钩子函数?如果是init 可能可以?但是有点不妥,因为有可能初始化的过程中会报错,这样就不会产生新的文件,所以就没有必要清除之前的文件
  • 很显然我们应该在 emit (写文件之前)去清理文件
  • 果然他也是在监听 emit,从而去执行 handleInitial 和 removeFiles(看函数名字就知道了,这俩函数逻辑非常简单,这里暂不分析了)
  • 但是细心的你肯定也发现了,为什么下面他还监听了 done?
  • 因为可能 emit 的时候也会产生一些垃圾、临时文件,所以也需要清理

ProvidePlugin

  • 这个插件主要用于注入全局变量,比如说每个文件都需要用到 JQuery,你需要每个文件都引入,
    用这个插件他会帮你自动引入,你直接用就好了
  • 使用方法很简单
  • 在选项中声明好,只要你用到了 $ 或者 JQuery,就会自动引入 JQuery
  • vue 同理

  • 同样,如果是我们写这个插件,我们应该监听哪个钩子函数?

  • 猜测应该是在 compilation 或者 make 阶段

  • 这个插件就不一样了,他主要监听的是 nft 的 parse 阶段
  • 我们来看这个 handle 函数做了什么
  • 遍历了 definition (就是选项哪个对象: {$: 'jquery', vue: [....]})
  • 分析所有的表达式(expression),如果你用到了哪些,就帮你直接在依赖中添加(等价于帮你自动 import)
  • 主要思路

正式因为插件可以在任何阶段进行魔改,所以 webpack 功能非常强大

常用插件

18个常用 webpack插件,总会有适合你的!

loader 与 plugin 的区别

loader 没啥问题,就是转换文件
它丰富了webpack本身(难道 loader 没有丰富 webpack 吗?)
针对是loader结束后(plugin 可以对任何阶段进行操作)
它并不直接操作文件(他可以直接操作文件,甚至可以删文件)
就这些修正

loader 比较简单,在 make 阶段中执行,单纯的文件转换过程,而 plugin 他是对 webpack 的功能进行拓展,他是基于事件机制,对 webpack 的每个阶段都可以进行介入,做一些功能(任何你想做的)。

如何自己写一个 plugin

  • 必须名声一个 class

  • 必须有一个 apply 函数,并且接受一个 compiler 参数

  • 接下来对某一个钩子进行监听,在写你的主要逻辑

  • 举例

  • 一个简单的在 done 之后打印一句话,和使用方法

  • 用到的主要知识

  • 对 webpack hooks 的了解

  • 对编译原理的了解

  • 对 chunk、hash、module、dep、factor 等概念的理解

相关文章

  • webpack plugn 插件原理

    从上文提炼出 webpack 的一些主要流程 init => run(前两个一般不用) => compile(编译...

  • webpack plugn插件开发

    webpack plugn配置: webpack插件主要是使用到两个对象,compiler和compilation...

  • bunny笔记|手写webpack

    学习目标 了解webpack打包原理 了解webpack的loader原理 了解webpack的插件原理 了解as...

  • 前端TODO

    Vue.js 等框架原理了解 webpack 原理了解 browserify 插件开发 Vue.js 等框架原理学习

  • webpack插件指南

    webpack 有着丰富的插件接口。webpack 自身的多数功能都使用插件接口。插件接口使 webpack 变得...

  • Webpack(二十六):如何编写一个WebPack的插件原理及

    一:webpack插件的基本原理 webpack构建工具大家应该不陌生了,那么下面我们来简单的了解下什么是webp...

  • vue项目中配置全局常量

    使用webpack插件webpack.DefinePlugin设置全局常量,可减少某些操作。 在webpack插件...

  • Webpack4-Plugins

    插件(Plugins) 插件是 webpack 的支柱功能。webpack 自身也是构建于,你在 webpack ...

  • 2020-06-01 学习计划

    1、js:红宝书,重点:原型,继承,闭包,设计模式 2、webpack: 打包原理,性能优化,配置,插件,看视频 ...

  • 缓存优化

    缓存优化的基本原理 Webpack 4 内置了压缩插件 TerserWebpackPlugin,且默认开启了缓存参...

网友评论

      本文标题:webpack plugn 插件原理

      本文链接:https://www.haomeiwen.com/subject/zjubrltx.html