这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天 冲!
Webpack定义解析
为什么要学习Webpack
- 理解前端 "工程化" 概念、工具、目标
- 一个团队总要有那么几个人熟悉
Webpack,某种成都上可以成为个人的核心竞争力 - 高阶前端必经之路
什么是Webpack
前端项目由什么构成 --资源
HTML、CSS、JS、TS、PNG、JPG、GIF、WEBP、Less、Vue、JSX、Sass等等
09年之前需要手动管理这些资源
缺点:
- 依赖手工,比如有50隔JS文件....操作过程繁琐
- 当源码文件之间有依赖的时候,就得严格按依赖顺序书写
- 开发与生产环境一致,难以接入TS或JS新特性
- 比较难介入Less、Sass等工具
- JS、图片、CSS资源管理模型不一样
- ...
直到出现了很多工程化工具
- Webpack
- Vite
- rollup
- browserify
- Gulp
- Require
- ...
Webpack是什么---本质上是一种前端资源编译、打包工具
- 多份资源文件打包成一个Bundle
- 支持Babel、Eslint、TS、CoffeScript、Less、Sass
- 支持模块化处理css、图片等资源文件
- 支持HMR+开发服务器
- 支持持续监听、持续构建
- 支持代码分离
- 支持Tree-shaking
- 支持Sourcemap
- ...
Webpack 打包核心流程
示例
安装
npm i -D webpack webpack-cli
编辑配置文件
// webpack.config.js
module.exports = {
entry: 'main.js',
output: {
filename: "[name].js",
path: path.join(__dirname, './dist')
},
module: {
rules: [{
test: /\.less%/i,
use: ['style-loader', 'css-loader', 'less-loader']
}]
}
}
执行编译命令
npx webpack
核心流程---极度简化版
- 模块化+一致性
- 多个文件资源合并成一个,减少http请求数
- 支持模块化开发
- 支持高级JS特性
- 支持TS、CoffeeScript方言
- 统一图片、CSS、字体等其他资源的处理模型
- Etc...
怎么使用Webpack
关于Webpack的使用方法,基本都围绕 "配置" 展开,而这些配置大致可划分为两类:
- 流程类:作用于流程中某个 or 若干个环节,直接影响打包效果的配置项
- 工具类:主流程之外,提供更多工程化能力的配置项
流程类配置
Entry => Dependencies Lookup => Transform => Bundle => Output
使用webpack
处理CSS
- 关键配置项介绍
Loader 组件
- Loader有什么作用,为什么需要用到 css-loader、style-loader
- 与旧时代---在HTML文件中维护css相比,这种方式会有什么优劣性?
- webpack中如何接入 less、sass、stylus这一类css预编译框架
参考资料: css-loader Webpack 原理系列七:如何编写loader style-loader
接入Babel
- babel具体有什么功能
- babel与Webpack分别解决了什么问题?为何两者能协作到一起
参考资料:
高版本代码转化为低版本代码
工具线
HMR
Hot Module Replacement---模块热替换
Plugin 组件
生成HTML
- 相比于手工维护HTML内容,这种自动生成的方式有什么优缺点
参考资料
Tree-Shaking
树摇---用于删除Dead Code
其他工具
- 除了上面提到的内容,还有哪些配置可划分为 '流程类'配置
- 工具类配置具体有什么作用? 包括'devtool/cache/stat'等
如何学习Webpack
- 入门级:学会灵活应用
- 进阶:学会扩展Webpack
- 大师:源码级理解
Webpack打包编译原理
survivejs-webpack book 深入浅出 Webpack
理解Loader--内容转化
问题:webpack只认识JS---非JS资源转化为JS资源
使用loader
认识loader:链式调用
认识loader:其他特性
如何编写loader

常见loader
站在使用角度,建议掌握这些常见loader的功能、配置方法
理解插件
思考题:
- loader输入是什么 要求的输出是什么
- loader的链式调用是什么意思 如何串连多个loader
- loader中如何处理异步场景
插件是什么 为什么这么设计
很多知名工具,如:
- Vscode、WebStorm、Chrome、Firefox
- Babel、Webpack、Rollup、Eslint
- Vue、Redux、Quill、Axios
- 等等都设计了所谓的"插件"架构 为什么?
这是一个特别复杂的过程,那么:
- 新人需要了解整个流程细节,上手成本高
- 功能迭代成本搞,牵一发动全身
- 功能僵化,作为开源项目而言缺乏成长性
- Blabla
心智成本高 => 可维护性低 => 生命力弱
插件架构精髓:对扩展开放,对修改封闭
甚至,webpack本身的很多功能也是基于插件实现的
理解插件
首先:插件围绕钩子展开
class SomePlugin {
apply(compiler) {
// 这是一个钩子
compiler.hooks.thisCompilation.tap('SomePlugin', (compilation) => {
})
}
}
这里侧重讲 钩子 的作用,重在:在编译的某个环节触发钩子,某种程度上可以理解为 —— 事件
钩子的核心信息:
- 时机:编译过程的特定节点,webpack会以钩子形式通知插件此刻正则发生的什么事情
- 上下文:通知tapable提供的回调机制,以参数方式传递上下文信息
- 交互:在上下文参数对象中附带了很多存在
side effect的交互接口,插件可以通过这些接口改变
时机:compier.hoos.compilation
参数:compilation等
交互:dependencyFactories.set
思考:
- loader与插件有什么区同点
- ‘钩子’有什么作用 如何监听钩子函数
参考: webpack插件架构深度讲解 万字总结 一文吃透 webpack 核心原理
小结:
- webpack的作用
- 理解webpack配置结构,学习关键配置项
- loader的作用与常用loader
- 插件基本形态与作用
如何学习Webpack
- 入门应用
- 理解打包流程
- 熟练掌握常用配置项、loader、插件的使用方法、能够灵活搭建集成vue、react、babel、eslint、less、sass、图片处理等工具的webpack环境
- 掌握常见脚手架工具的用法,例如:vue-cli、create-react-app、@angular/cli
- 进阶
- 理解loader、plugin机制,能够字型开发webpack组件
- 理解常见性能优化手段,并能用于解决实际问题
- 理解前端工程化概念与生态优化
- 大师级
- 阅读源码,理解webpack编译、打包原理,甚至能够参与共建