构建Webpack知识体系(进阶篇)| 青训营笔记

101 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第14天

👋本文介绍:1. 理解Loader | 2. 理解插件 | 3. 学习方法

理解Loader

Loader:用来解决Webpack只认识JS的问题
为了处理非标准Js资源,设计出资源翻译模块——Loader用于将资源翻译为标准JS

链式调用

链式调用: Webpack 会按顺序链式调用每个Loader

Snipaste_2022-08-09_15-04-43.png

  • less-loader:实现 less=>css的转换
  • css-loader:将CSS包装成类似module.exports="${css}"的内容,包装后的内容符合JavaScript 语法
  • style-loader:将css模块包进require语句,并在运行时调用injectStyle等函数将内容注入到页面的style标签

🤔为什么我们有时要定义多个loader呢?

  • 第一个loader的输出的结果往往会变成第二个loader的输入,每个loader完成的功能比较单一,通过链式调用就可以完成一件复杂的事情

Loader运行机制

Snipaste_2022-08-09_15-11-31.png 特点:

  • 链式执行
  • 支持异步执行
  • 分normal、pitch 两种模式

如何编写Loader

标准Loader所需具备的内容:

// loader.jsmodule.exports =function(source,sourceMap?,data?){
//source为loader 的输入
//可能是文件内容,也可能是上一个loader 处理结果
return source;
};

eslint-loader的实现:

Snipaste_2022-08-09_15-16-31.png
可以参考的资料:www.webpackjs.com/contribute/…

常见Loader

Snipaste_2022-08-09_15-17-24.png

理解插件

😅 webpack编译是一个特别复杂的过程,如果新人要去改工具的代码,需要了解整个流程细节,上手成本高、功能迭代成本高,牵一发动全身、功能僵化,作为开源项目而言缺乏成长性 ==> 导致项目难维护,生命力低
为了解决这个问题,就要用到了插件

插件架构精髓:对扩展开放,对修改封闭(只做最核心的部分)

在Webpack中使用插件(以DashboardPlugin为例)

//npm i-D webpack-dashboard
//Import the plugin: 
const DashboardPlugin =require("webpack-dashboard/plugin");
//Add it to your webpack configuration plugins.
module. exports={
    plugins:[ new DashboardPlugin()];
};

Dashboard插件的作用:
把编译过程的信息用好看的界面展示出来

Snipaste_2022-08-09_15-40-10.png

钩子

首先:插件围绕着钩子展开
在编译的某个环节触发钩子,某种程度上可以理解为——事件
例如:
插件一般带有apply函数,图中的compiler为编译器对象

image (1).png
核心语句 compiler.hooks.thisCompilation.tap,其中 thisCompilation 为 tapable 仓库提供的钩子对象;tap 为订阅函数,用于注册回调。


钩子的核心信息:

  1. 时机:编译过程的特定节点,Webpack会以钩子形式通知插件此刻正在发生什么事情;
  2. 上下文:通过tapable提供的回调机制,以参数方式传递上下文信息;
  3. 交互:在上下文参数对象中附带了很多存在side effect的交互接口,插件可以通过这些接口改变

触发钩子的时机

大体上从启动到结束,compiler 对象逐次触发如下钩子:

Snipaste_2022-08-10_10-40-36.png

学习方法

Webpack5知识体系: gitmind.cn/app/doc/fac…

1. 入门应用(能用)

  • 理解打包流程
  • 熟练掌握常用配置项、Loader、插件的使用方法,能够灵活搭建集成Vue、React、Babel、Eslint、Less、sass、图片处理等工具的Webpack环境
  • 掌握常见脚手架工具的用法,例如:Vue-cli、reate-react-app、@angular/cli

2. 进阶

  • 理解Loader、Plugin 机制,能够自行开发webpack组件(能写适合自己的Loader、Plugin)
  • 理解常见性能优化手段,并能用于解决实际问题
  • 理解前端工程化概念与生态现状

3. 大师级

  • 阅读源码,理解Webpack编译、打包原理,甚至能够参与共建

Snipaste_2022-08-09_15-49-01.png

参考资料:
mp.weixin.qq.com/s/tXkGx6Ckt…
mp.weixin.qq.com/s/SbJNbSVzS…