Webpack知识体系 | 青训营笔记

73 阅读6分钟

Webpack 知识体系

为什么要学习 Webpack?

  • 理解前端“工程化”概念、工具、目标
  • 一个团队总要有那么几个人熟悉 Webpack,某种程度上可以成为个人的核心竞争力
  • 高阶前端必经之路

什么是 Webpack

前端项目由什么构成? ———— 资源image.png可以手动管理这些资源:image.png

  • 依赖手工,比如有50个JS文件...操作,过程繁琐
  • 当代码文件之间有依赖的时候,就得严格按依赖顺序书写
  • 开发与生产环境一致,难以接入 TS 或 JS 新特性
  • 比较难接入 Less、Sass 等工具
  • JS、图片、CSS 资源管理模型不一致

这些都是旧时代非常突出的问题,对开发效率影响非常大,直到...image.pngimage.png本质上是一种前端资源编译、打包工具

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

使用 Webpack

示例

  1. 安装

image.png2. 编辑配置文件image.png3. 执行编译命令image.pngimage.png

核心流程 —— 极度简化版

image.png

模块化 + 一致性

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

使用 Webpack

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

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

image.png

流程类配置

image.png

配置总览

image.png按使用频率:

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

webpack.js.org/configurati…

使用 Webpack

image.png

  1. 声明入口entry

image.png2. 声明产物出口outputimage.png3. 运行npx webpack

处理 CSS

image.pngimage.png

  1. 安装 Loader

image.png2. 添加module处理 css 文件image.png

image.png

使用 webpack

image.png问题:

  • Loader 有什么作用?为什么这里需要用到 css-loader、style-loader
  • 与旧时代 —— 在 HTML 文件中维护 css 相比,这种方式会有什么优劣势?
  • 有没有接触过 Less、Sass、Stylus 这一类 CSS 预编译框架?如何在 Webpack 接入这些工具?

参考资料:

接入 Babel

image.pngimage.png

  1. 安装依赖

image.png2. 声明产物出口outputimage.png3. 执行npx webpack

image.png

思考题:

  • Babel 具体有什么功能?
  • Babel 与 Webpack 分别解决了什么问题?为何两者能协作到一起了?

参考资料:

生成 HTML

image.png

  1. 安装依赖

image.png2. 声明产物出口outputimage.png3. 执行npx webpack

image.png

思考题:

  • 相比于手工维护 HTML 内容,这种自动生成的方式有什么优缺点?

参考资料:

工具线

image.png

HMR

image.png

  1. 开启 HMR

image.png2. 启动 webpackimage.pngimage.png参考:《Webpack 原理系列十:HMR 原理全解析》mp.weixin.qq.com/s/cbYMpuc4h…

Tree-Shaking

image.png

image.pngDead Code

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

Tree-Shaking

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

image.png开启 tree-shaking:

  • mode:"production"
  • optimization.usedExports:true

PS:对工具类库如 Lodash 有奇效

其它工具:

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

思考题:

进阶篇:理解 Loader

问题:Webpack 只认识 JS

image.png为了处理分标准 JS 资源,设计出资源翻译模块 ———— Loader

用于将资源翻译为标准 JS

使用 Loader

image.pngimage.png

  1. 安装 Loader

image.png2. 添加moudle处理 css 文件image.png

认识 Loader:链式调用

image.png

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

认识 Loader:其它特性

image.png特点:

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

参考:Webpack 原理系列七:如何编写loader mp.weixin.qq.com/s/TPWcB4MfV…

如何编写 Loader

image.pngimage.png参考:Webpack 原理系列七:如何编写loader mp.weixin.qq.com/s/TPWcB4MfV…

常见 Loader

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

理解插件

思考题:

  • Loader 输入是什么?要求的输出是什么?
  • Loader 的链式调用是什么意思?如何串联多个 Loader?
  • Loader 中如何处理异步场景?

进阶篇:理解插件

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

很多知名工具,如:

  • VS Code、Web Storm、Chrome、Firefox
  • Babel、Webpack、Rollup、Eslint
  • Vue、Redux、Quill、Axios

等等,都设计了所谓“插件”架构,为什么?

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

  • 新人需要了解整个流程细节,上手成本高
  • 功能迭代成本高,牵一发动全身
  • 功能僵化,作为开源项目而言缺乏成长性
  • Blabla

心智成本高 => 可维护性低 => 生命力弱

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

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

image.pngimage.png

使用 html-webpack-pluginimage.png使用 html-webpack-plugin + DefinePluginimage.png

用起来很简单,但写起来很难

首先:插件围绕钩子展示image.png钩子的核心信息:

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

image.png时机:compier.hooks.compilation

参数:compilation

交互:dependencyFactories.setimage.png

思考题:

  • Loader 与插件有什么区同点?
  • “钩子”有什么作用?如何监听钩子函数?

参考:

image.png

学习方法

  1. 入门应用
  • 理解打包流程
  • 熟练掌握常用配置项、Loader、插件的使用方法,能够灵活搭建集成 Vue、React、Babel、Eslint、Less、Sass、图片处理等工具的 Webpack 环境
  • 掌握常见脚手架工具的用法,例如:Vue-cli、create-react-app、@angular/cli
  1. 进阶
  • 理解 Loader、Plugin机制,能够自行开发 Webpack 组件
  • 理解常见性能优化手段,并能用于解决实际问题
  • 理解前端工程化概念与生态现状
  1. 大师级

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

知识点

image.png