Webpack知识体系 | 青训营笔记

66 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

Webpack知识体系

image.png

新手知识点:

image.png

GitMind

核心概念:

  • 入口(entry)

指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

  • 输出(output)

告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件

  • loader

处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,

  • 插件(plugins)

被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。

webpack是什么?

是一种前端资源编译、打包工具

image.png

image.png

image.png

webpack的特点

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

image.png

如何使用webpack?

webpack使用起来其实就是一个工具,几乎所有的操作都是在webpack.config.js文件中操作的。

1.示例

安装 npm i webpack webpack-cli

2.配置文件

image.png

3. 执行编译命令 npx webpack

打包流程

  1. 入口处理

    • entry的文件开始,启动编译流程
  2. 依赖解析

    • entry文件开始,根据require or import等语句找到依赖资源
  3. 资源解析

    • 根据module配置,调用资源转移器,将png、css等非标准JS资源转译为JS内容
  4. 资源合并打包

    • 将转译后的资源内容合并打包为可直接在浏览器运行的JS文件 (递归调用2、3直到所有资源处理完毕)

image.png

优点

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

使用Webpack

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

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

image.png

流程类配置

image.png

image.png

image.png

image.png

处理css

首先我们需要安装loader npm add -D css-loader style-loader

loader是一个函数,他把我们传入的文件转换成我我们需要的样子

image.png

接入Babel

Babel 是一个 JavaScript compiler

Babel 是一个工具链,主要用于在当前和旧的浏览器或环境中,将 ECMAScript 2015+ 代码转换为 JavaScript 向后兼容版本的代码。更简单的说,Babel可以把使用ES6/ES7等“高级”语法编写的Javascript代码转换为ES5/ES3的“通俗”语法(也可以把JSX语法转为Javascript)。

image.png

image.png

生成html

使用html-webpack-plugin

html-webpack-plugin 的作用是:当使用 webpack打包时,创建一个 html 文件,并把 webpack 打包后的静态文件自动插入到这个 html 文件当中。

image.png

image.png

工具线

image.png

HMR

HMR的全称是Hot Module Replacement,翻译为模块热替换

模块热替换是指在 应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面

HMR通过如下几种方式,来提高开发的速度:

  1. 不重新加载整个页面,这样可以保留某些应用程序的状态不丢失

  2. 只更新需要变化的内容,节省编译的时间

  3. 修改了css、js源代码,会立即在浏览器更新,相当于直接在浏览器的devtools中直接修改样式

image.png

Tree-Shaking

Tree-shaking树摇,用来删除Dead Code,就是删除没有被用到的代码减轻文件体积。

image.png

image.png

其它工具:

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

理解Loader

loader的作用?

image.png Webpack只认识js,为了处理非标准JS资源.设计出资源翻译模块—— Loader 。用于将资源翻译为标准JS

使用Loader

image.png

链式调用的原理

image.png

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

特点

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

如何编写Loader

image.png

常见的Loader

image.png

理解插件

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

image.png

这是一个特别复杂的过程,那么∶

  • 新人需要了解整个流程细节,上手成本高
  • 功能迭代成本高,牵一发动全身
  • 功能僵化,作为开源项目而言缺乏成长性
  • Blabla
  • 心智成本高=>可维护性低=>生命力弱
  • 插件架构精髓:对扩展开放,对修改封闭

image.png

image.png

image.png

插件是围绕着钩子展开的

image.png image.png

钩子的核心信息是:

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

image.png