这是我参加[第五届青训营]伴学笔记创作活动的第12天
本堂课程重要知识
- 了解Webpack 的本质、定义解析和优势
- 理解 Loader和插件
下文涉及到每部分的部分思考题是课堂中老师有提及的知识,作为回顾复习对自己的反问
学习webpack原因
- 理解前端"工程化"概念、工具、目标
- 一个团队总要有那么几个人熟悉Webpack,某种程度上可成为个人的核心竞争力
- 高阶前端必经之路
什么是Webpack
前提概要: 前端项目是由各种资源构成,包括图片(png/jpg/gif/webp)、脚本文件(js/ts/jsx)、样式文件(css/less/sass)和框架(vue)等。虽然可手动管理资源,但依赖手工,过程繁琐;当代码文件之间有依赖的时候,就得严格按依赖顺序书写;开发与生产环境一致,难以接入TS或JS新特性;比较难接入Less、Sass等工具;JS、图片、CSS资源管理模型不一致等问题对开发效率造成麻烦。
故,自09年起出现了很多工程化工具,然后有了“前端工程”的概念
【本质】 一种前端资源编译、打包工具
使用webpack
1.安装
输入命令npm i -D webpack webpack-cli
2.编辑配置文件
webpack.config.js
entry-定义当前项目的入口
output-定义打包后项目文件的位置
3.执行编译命令
输入命令npx webpack
最终结果如下图
import变成require,多个资源合成一个资源
核心流程
实质上,webpack做两件事情——模块化和一致性
- 多个文件资源合并成一个,减少 http请求数
- 支持模块化开发
- 支持高级JS特性
- 支持 Typescript、CoffeeScript方言
- 统一图片、CSS、字体等其它资源的处理模型
- ...
如何编写配置文件
配置项大致分为两类:
- 流程类:作用于流程中某个or若干个环节,直接影响打包效果的配置项
- 工具类:主流程之外,提供更多工程化能力的配置项
可以从红色框出的配置项配置起,基本上只要由entry和output就行
处理CSS
1.安装Loader npm add -D css-loader style-loader
2.添加module处理css文件
test:/\.css$/过滤条件
用use中的loader来处理满足test条件的文件
Loader的作用:处理不同资源
思考题:
- Loader有什么作用?为什么这里需要用到css-loader、style-loader
- 与旧时代在HTML文件中维护css相比,这种方式会有什么优我劣处?
- 有没有接触过 Less、Sass、Stylus这一类 CSS预编译框架?如何在Webpack接入这些工具?
参考资料:
处理js,接入Babel(代码转译工具)
高版本的js代码转成低版本的,缘由ES6的出现导致某些无法使用
1.安装依赖 npm i -D @babel/core @babel/preset-env babel-loader
2.声明产品出口 output
3.执行npx webpack
思考题:
- Babel具体有什么功能?
- Babel与Webpack分别解决了什么问题?为何两者能协作到一起了?
参考资料:
生成HTML
1.安装依赖 npm i -D html-webpack-plugin
2.声明产品出口 output
3.执行npx webpack
思考题:
- 相比于手工维护HTML内容,这种自动生成的方式有什么优就缺点?
参考资料:
工具线
1.判断配置项类型(工具/流程)
2.再详细判断
- 流程类-属于哪个流程
- 工具类-属于提升哪方面的工具
HMR
Hot Module Replacement--模块热替换
修改的代码能在不刷新浏览器的情况下立刻显示在浏览器上
| Webpack 原理系列十:HMR 原理全解析 | Tecvan |
|---|---|
| 1.配置HMR 2.处理css 3.生成html 4.启动监听 |
Tree-Shaking
树摇,用于删除Dead Code
对工具类库如Lodash有奇效
Dead Code
- 代码没有被用到,不可到达
- 代码的执行结果不会被用到
- 代码只读不写
Tree-Shaking
- 模块导出了,但未被其它模块使用
其他
- 缓存 版本5之后效果较好
- SourceMap 提升线上调试的效率
- 性能监控
- 日志
- 代码压缩
- 分包
- ...
思考题:
- 除上面提到的内容,还有哪些配置可划分为"流程类"配置?
- 工具类配置具体有什么作用?背后使用的技术分别是什么?包括
devtool/cache/stat等
参考资料 awesome-webpack-4plus 深入浅出 Webpack survivejs-webpack Book
理解 Loader
核心功能:用于将资源翻译为标准JS
1.安装各种需要的loader包
2.在配置文件添加对应的module处理资源,以处理css为例
认识Loader:链式调用
less-loader:实现less=>css的转换
css-loader:将CSS包装成类似module.exports="${css}"的内容,包装后的内容符合JavaScript语法
style-loader:将css模块包进require语句,并在运行时调用 injectStyle等函数将内容注入到页面的style标签
检测loader包的操作:1.在对应loader包中添加debugger;2.执行ndb npx webpack
其他特征
- 链式执行
- 支持异步执行
- 分normal和pitch两个模式
详细过程见Webpack 原理系列七:如何编写loader
常见loader--掌握常见的功能和配置方法
思考题:
- Loader输入是什么?要求的输出是什么?
- Loader的链式调用是什么意思?如何串联多个Loader?
- Loader中如何处理异步场景?
理解插件
一个开源项目(比如webpack编译)过程较为复杂,新手需了解整个过程和原理才能理解,但有了插件,降低了上手成本,功能迭代成本也会降低,不会牵一发动全身,而且作为开源项目不经常设计容易功能僵化,缺乏成长性,开发者的积极性和可维护性就会较低,那么该开源项目的生命力弱,很容易走向死亡
插件架构精髓:对扩展开放,对修改封闭
插件围绕钩子展开
钩子的核心信息:
- 时机:编译过程的特定节点,Webpack会以钩子形式通知插件此刻正在发生什么事情;
- 上下文:通过tapable提供的回调机制,以参数方式传递上下文信息;
- 交互:在上下文参数对象中附带了很多存在side effect的交互接口,插件可以通过这些接口改变
webpack大约有239个钩子,下图是简化版
思考题:
- Loader与插件有什么区同点?
- "钩子"有什么作用?如何监听钩子函数?
参考:
Webpack 学习方法推荐
01.入门应用
- 理解打包流程
- 熟练掌握常用配置项、Loader、插件的使用方法,能够灵活搭建集成Vue、React、Babel、Eslint、Less、Sass、图片处理等工具的Webpack环境
- 掌握常见脚手架工具的用法,例如:Vue-cli、create-react-app、@angular/cli
02.进阶
- 理解 Loader、Plugin机制,能够自行开发Webpack组件
- 理解常见性能优化手段,并能用于解决实际问题
- 理解前端工程化概念与生态现状
03.大师级
- 阅读源码,理解Webpack编译、打包原理,甚至能够参与共建