Webpack知识体系 | 青训营笔记

61 阅读4分钟

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

一、为什么要学习Webpack

  • 理解前端“工程化”概念,工具,目标
  • 提升自己的核心竞争力,一个团队总要有人熟悉Webpack
  • 高阶前端必经之路

二、什么是Webpack?

image.png Webpack本质上是一种资源编译,打包工具,用来解决代码中的资源文件过多手动维护困难等问题。

image.png

三、起步

  1. 安装

image.png

  1. 编写配置文件

image.png

  1. 执行编译命令

image.png

四、核心流程(极度简化版)

graph TD
1.GetStart --> 2.DependenciesLookup --> 3.Transform --> 4.CombineAssets
  1. 入口处理:从‘entry’文件开始,启动编译流程
  2. 依赖解析:从‘entry’文件开始,根据require或import等语句找到依赖资源
  3. 资源解析:根据‘moudle’配置,调用资源转移器,将png、css等非标准JS资源转译为JS内容
  4. 资源合并打包:将转译后的资源内容合并打包为可直接在浏览器运行的JS文件

注意:过程中会递归调用2、3步骤,直到所有资源处理完毕

五、模块化+一致性

image.png

六、使用Webpack

1.基本使用

image.png

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

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

image.png

流程类配置

  • 输入(GetStart): 'entry', 'context'
  • 模块解析(DependenciesLookup):'resolve', 'externals'
  • 模块转译(Transform):'module'
  • 后处理(CombineAssets):'optimization', 'mode', 'target'

流程类配置

  • 开发效率类:'watch', 'devtool', 'devServer'
  • 性能优化类: 'cache', 'performance'
  • 日志类:'stats', 'infrastructureLogging'

配置总览

image.png Webpack官方配置文档

按使用频率:

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

2.使用Webpack处理CSS

文件结构

image.png

内容

image.png

1.安装Loader

image.png

2.添加 'module' 配置处理css文件

image.png 参考:style-loadercss-loaderWebpack 原理系列七:如何编写loader

3.使用Webpack接入Babel

文件结构

image.png

内容

image.png

1.安装依赖

image.png

2.声明产物出口 'output'

image.png 3.执行 'npx webpack'控制台输出日志

image.png 参考:@babel/preset-envbabel-loaderbabel官网

4.使用Webpack生成HTML

文件结构

image.png

1.安装依赖

image.png

2.声明产物出口'output',配置 'plugins'

image.png

3.执行'npx webpack' 文件建构变化——生成了index.html

image.png

index.html文件内容

image.png

5.使用Webpack之HMR(Hot Module Replacement)

1.开启HMR

image.png

2.启动Webpack

image.png

image.png 参考:Webpack 原理系列十:HMR 原理全解析

5.使用Webpack之Tree-Shaking

Trer-Shaking ——树摇,用于删除 Dead Code。

Dead Code ——代码没有被用到,不可到达;代码的执行结果不会被用到;代码只读不写。

示例

image.png

开启 tree-shaking:

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

注意:对工具类库如Lodash有奇效

6.Webpack的其他工具

缓存,Soucemap,性能监控,日志,代码压缩,分包...

详情见Webpack官网

七、理解Loader

问题:Webpack只认识JS。

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

使用loader的步骤:

1.安装Loader

image.png

2.添加 'module'配置

image.png

Loader的链式调用:

image.png

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

其他特性:

image.png

特点:

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

如何编写Loader

示例 eslint-loader

image.png

默认暴露一个函数入参为source,sourceMap(可选),data(可选)返回值为处理后的source,以便于链式调用。

image.png

参考:Webpack 原理系列七:如何编写loader

常用Loader

image.png

八、理解Plugins

很多知名工具,如: vs Code、Web Storm、Chrome、FirefoxBabel、Webpack、Rollup、Eslint Vue、Redux、Quill、Axios 等等.都设计了所谓"插件"架构,为什么?

插件又是什么?为什么这么设计? 下图为Webpack执行流程图

image.png

这是一个特别复杂的过程,那么就会导致:

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

而插件架构精随:对扩展开放,对修改封闭。 甚至,Webpack 本身的很多功能也是 基于插件实现的

使用插件的步骤

1.下载插件

2.创建插件实例

image.png

如何实现一个插件

参考:Webpack 插件架构深度讲解一文吃透 Webpack 核心原理

学习方法总结:

1. 入门应用:

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

2. 进阶:

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

3. 大师级:

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

适合新手的体系图:

image.png

参考:Webpack体系图