Webpack知识体系 | 青训营笔记

54 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

以下为今日课上笔记内容

为什么要学习 Webpack?

  • 理解前端“工程化”概念、工具、目标
  • 一个团队总要有那么几个人熟悉 Webpack,某种程度上可以成为个人的核心竞争力
  • 高阶前端必经之路 webpack 知识体系 一. 什么是 Webpack 7ddaab14de7c9ced3c7df41dfd7b9e6.png 当然,可以手动管理这些资源,但
  • 依赖手工,比如有50个JS文件...操作,过程繁琐。
  • 当代码文件之间有依赖的时候,就得严格按依赖顺序书写
  • 开发与生产环境一致,难以接入 JS 或JS 新特性
  • 比较难接入 Less、Sass 等工具JS、图片、CSS 资源管理模型不一致 这些都是旧时代非常突出的问题,对开发效率影响非常大,直到...

926fe015abf36b75ed5ef5955f7483a.png

01006925af6ce84fc1f5b360afa33c2.png

本质上是一种前端资源编译、打包工具

  • 多份资源文件打包成一个 Bundle
  • 支持 Babel、 Eslint、JS、CoffeScript、 Less、Sass
  • 支持模块化处理 css、图片 等资源文件
  • 支持 HMR + 开发服务器支持持续监听、持续构建
  • 支持代码分离
  • 支持 Tree-shaking
  • 支持 Sourcemap ...

f4203652dacee4ce3cb619adb2d8b4e.png

二.使用 Webpack

1.使用 Webpack -- 示例

9d6b55bce5da1e654f87288345ef33d.png

2.核心流程 -- 极度简化版

5e39b9fa846dee88bd6e88fc67d038d.png

3.模块化 + 一致性

  • 多个文件资源合并成一个,减少 http 请求数
  • 支持模块化开发
  • 支持高级 JS特性
  • 支持 Typescript、CoffeeScript 方言
  • 统一图片、CSS、字体 等其它资源的处理模型
  • Etc..

4.使用 Webpack

关于 Webpack 的使用方法,基本都围绕“配置展开,而这些配置大致可划分为两类

  • 流程类: 作用于流程中某个 or 若干个环节直接影响打包效果的配置项c
  • 工具类: 主流程之外,提供更多工程化能力的配置项

4c7934a49ab44eab95d01e2780d3565.png

5.使用 Webpack --流程类配置

2f70bd1439dc0114e6f5907c8c34ae9.png

6.使用 Webpack -- 配置总览

按使用频率

  • entry / output
  • module / plugins
  • mode
  • watch / devServer / devtool

6fbdf2593196a3860cad2d564776ea8.png

7.使用 Webpack

19e19f69afc675b7ba25a41d66bfced.png

8.使用 Webpack -- 处理 CSS

7ba806e98c72387884395722c3b621d.png

b4c0521e2c997acfb078541e97dce55.png

d26063eb139c8f6f759e101591b91e6.png

9.使用 Webpack 一- 接入 Babel

385109f1356b81dbcc171b532387de7.png

7f45cf7ccdd5d3cef742568e24d1a11.png

10.使用 Webpack--生成 HTML

513080fae6191201e12cadda507d997.png

90eaa87027011052af4e28fbe7e94b0.png

11.使用 Webpack -- 工具线

1fdfde6ac9da503fa328a36c83b05bf.png

12.使用 Webpack--HMR

f0250931db135ebe7dddedd1d5443ab.png

3d59f7692e117f33d3c960f28081016.png

13.使用 WebpackTree -- Shaking

Tree-Shaking - 树摇,用于删除 Dead Code

eb29f4b6273397b60f7bb6153136ed5.png

Dead Code

  • 代码没有被用到,不可到达
  • 代码的执行结果不会被用到
  • 代码只读不写

Tree-Shaking

  • 模块导出了,但未被其它模块使用

9fb278de132212960a5fcfe69c638cf.png

开启 tree-shaking:

  • mode: “production”;
  • optimization.usedExports: true: PS: 对工具类库如 Lodash 有奇效

14.使用 Webpack

其它工具:

  • 缓存
  • Sourcemap
  • 性能监控
  • 日志
  • 代码压缩
  • 分包 ...

5b33193469a8e4eb9a9f380f68bcf5c.png

三.进阶篇: 理解 Loader

1.问题: Webpack 只认识JS

为了处理非标准JS 资源,设计出资源翻译模块 Loader用于将资源翻译为标准 JS.

92d4ad72144a7ce12596065ff9648ab.png

2.使用 Loader

38f5f848a9f20fee4d126bc5455e7fd.png

3.认识 Loader:链式调用

fe0be1cb1783eed85fbc710d816fb8b.png

  • less-loader:实现 less => css 的转换
  • less-loader:将 CSS 包装成类似 module.exports=“[scss]”的内容,包装后css-loader: 的内容符合 JavaScript 语法
  • style-loader: 将 css 模块包进 require 语句,并在运行时调用 iniectStyle 等函数将内容注入到页面的 style 标签 4.认识 Loader:其它特性

特点:

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

1300bb1ccabbe0e3cf0cacc1539a771.png

5.如何编写 Loader

3cfd8c9d0a747ecf8509256b10b056c.png

6.常见 Loader

站在使用角度,建议掌握这些常见 Loader 的功能、配置方法

aaef9d1c1601cbaa20b21d07e0ca76b.png

四.进阶篇: 理解插件

1.插件是什么?为什么这么设计?

这是一个特别复杂的过程,那么:

  • 新人需要了解整个流程细节,上手成本高c
  • 功能选代成本高,牵一发动全身c
  • 功能僵化,作为开源项目而言缺乏成长性
  • ... 心智成本高 => 可维护性低 => 生命力弱

插件架构精髓: 对扩展开放,对修改封闭

1dcfeb04b19cab856a24331aae4d666.png

甚至,Webpack 本身的很多功能也是基于插件实现的

2.理解插件

60ca28f0d1805655323ce0b04dc97a5.png

c3f85f8d348f2a9702263037dbe9d30.png

首先:插件围绕 钩子 展开

0f0069bc946a9fc0aededcf3191ba53.png

钩子的核心信息 1)时机: 编译过程的特定节点,Webpack 会以钩子形式通知插件此刻正在发生什么事情。

2)上下文: 通过 tapable 提供的回调机制,以参数方式传递上下文信息。

3)交互: 在上下文参数对象中附带了很多存在 side effect 的交互接口,插件可以通过这些接口改变。

0341b4d7bc554a349fc8c461a8f1064.png

时机:compier.hooks.compilation

参数:compilation'等

交互:dependencyFactories.set

1583dbeeb5271d7a6018a592aaa1874.png

小结

  • 我们前面学了 Webpack 的作用
  • 理解 Webpack 配置结构,学习关键配置项
  • Loader 的作用与常用 Loader
  • 插件基本形态与作用

2debc5ee6d8fd3862e0d5ff45a441c8.png

五.学习方法

1.入门应用

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

2.进阶

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

3.大师级

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

知识点

565b814fef01d389ebc62817a6937c7.png