Webpack知识体系 | 青训营笔记

44 阅读2分钟

Webpack知识体系

1 什么是Webpack

前端项目由各种资源构成

手动管理这些资源的缺陷:

  • 资源文件过多时,操作过程繁琐
  • 资源文件之间有依赖关系的时候,需要严格按照依赖顺序书写
  • 开发与生产环境一致,难以接入TS或JS新特性
  • 比较难以接入Less、Sass等工具
  • JS、图片、CSS资源管理模型不一致

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

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

2 Webpack打包核心流程

2.1 打包核心流程(极简版)

2.2 核心优势:模块化 + 一致性

  • 多个文件资源合并成一个,减少HTTP请求数
  • 支持模块化开发
  • 支持高级JS特性
  • 支持TypeScript、CoffeeScript语法
  • 统一图片、CSS、字体等其它静态资源的处理模型
  • ……

3 使用webpack

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

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

3.1 流程类配置

按使用频率:

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

流程类配置使用方法:

3.2 处理CSS

安装配置css-loader、style-loader,即可在js文件中引入css样式文件

3.3 接入Babel

3.4 生成HTML

3.5 HMR

mp.weixin.qq.com/s/cbYMpuc4h…

3.6 Tree-Shaking

3.7 其它工具

  • 缓存
  • SourceMap
  • 性能监控
  • 日志
  • 代码压缩
  • 分包
  • ……

3 Loader

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

3.1 使用Loader

3.2 链式调用

以上图为例:

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

3.3 其它特性

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

3.4 如何编写Loader

mp.weixin.qq.com/s/TPWcB4MfV…

3.5 常见Loader

4 Plugin

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

插件围绕“钩子”展开

钩子的核心信息:

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