前端学习记录
  • 前言及目录
  • 前端基础
    • HTML
    • CSS
      • CSS学习之布局
    • JavaScript
      • 跟着月影学JavaScript
      • JavaScript之对象、原型链及继承
      • JavaScript中的类
      • onclick与addEventListener区别
      • JS手撕题
    • HTTP与浏览器
      • HTTP实用指南
      • Web开发的安全之旅
    • 通用知识
      • 前端必须知道的开发调试知识
      • 前端设计模式应用
      • Web 标准与前端开发
  • 数据结构及算法
    • 数据结构
      • 1、线性表(List)
      • 2、堆栈(Stack)
      • 3、队列(Queue)
      • 4、二叉树(Binary Tree)
      • 5、二叉搜索树与平衡二叉树(BST & AVL)
      • 6、堆(Stack)& 哈夫曼树 & 并查集
      • 7、图(Graph)
        • 图论——解决最小生成树问题(Kruskal算法&Prim算法)
      • 8、排序(sort)
      • 9、散列表(hash)
      • 数据结构习题
        • 第一周:最大子列和算法、二分查找
        • 第二周:线性结构
        • 第三周:栽树(二叉树等)
        • 第四周:二叉搜索树&二叉平衡树
        • 第五周:堆&哈夫曼树&并查集
        • 第六周:图(上)连通集 、DFS&BFS
        • 第七周:图(中)Floyd算法求最短路
        • 第八周:图(下)
        • 第九周:排序(上)归并&堆排序
        • 第十周:排序(下)
        • 第十一周:散列查找 & KMP
    • CS基础
      • 编译原理 实验一 词法分析器设计
      • 编译原理 实验二 LL(1)分析法程序
    • LeetCode
      • 冲刺春招-精选笔面试 66 题大通关
        • day1:21. 合并两个有序链表、146. LRU 缓存、25. K 个一组翻转链表
        • day2:14. 最长公共前缀、3. 无重复字符的最长子串、124. 二叉树中的最大路径和
        • day3:206. 反转链表、199. 二叉树的右视图、bytedance-016最短移动距离
        • day4:1. 两数之和、15. 三数之和、42. 接雨水
        • day5:7. 整数反转、215. 数组中的第K个最大元素、23. 合并K个升序链表
        • day6:33. 搜索旋转排序数组、54. 螺旋矩阵、bytedance-006. 夏季特惠
        • day7:53. 最大子数组和、152. 乘积最大子数组、41. 缺失的第一个正数
        • day8:20. 有效的括号、200. 岛屿数量、76. 最小覆盖子串
        • day9:105. 从前序与中序遍历序列构造二叉树、103. 二叉树的锯齿形层序遍历、bytedance-010. 数组组成最大数
        • day10:94. 二叉树的中序遍历、102. 二叉树的层序遍历、394. 字符串解码
        • day11:415. 字符串相加、5. 最长回文子串、72. 编辑距离
        • day12:64. 最小路径和、300. 最长递增子序列、bytedance-004. 机器人跳跃问题
        • day13:88. 合并两个有序数组、31. 下一个排列、4. 寻找两个正序数组的中位数
        • day14:121. 买卖股票的最佳时机、56. 合并区间、135. 分发糖果
        • day15:232. 用栈实现队列、22. 括号生成、128. 最长连续序列
        • day16:bytedance-007. 化学公式解析、129. 求根节点到叶节点数字之和、239. 滑动窗口最大值
        • day17:141. 环形链表、236. 二叉树的最近公共祖先、92. 反转链表 II
        • day18:322. 零钱兑换、198. 打家劫舍、 bytedance-003. 古生物血缘远近判定
        • day19:160. 相交链表、143. 重排链表、142. 环形链表 II
        • day20:704. 二分查找、43. 字符串相乘、bytedance-002. 发下午茶
        • day21题目:69. x 的平方根、912. 排序数组、887. 鸡蛋掉落
        • day22:151. 颠倒字符串中的单词、46. 全排列、2. 两数相加
      • 剑指 Offer
        • 剑指offer day1 栈与队列(简单)
        • 剑指offer day2 链表(简单)
        • 剑指offer day3 字符串(简单)
        • 剑指offer day4 查找算法(简单)
        • 剑指offer day5 查找算法(中等)
        • 剑指offer day6 搜索与回溯算法(简单)
        • 剑指offer day7 搜索与回溯算法(简单)
        • 剑指offer day8 动态规划(简单)
        • 剑指offer day9 动态规划(中等)
        • 剑指offer day10 动态规划(中等)
        • 剑指offer day11 双指针(简单)
        • 剑指offer day12 双指针(简单)
        • 剑指offer day13 双指针(简单)
        • 剑指offer day14 搜索与回溯算法(中等)
        • 剑指offer day15 搜索与回溯算法(中等)
        • 剑指offer day16 排序(简单)
        • 剑指offer day17 排序(中等)
      • 剑指 Offer 专项突击版
  • 前端进阶
    • React
      • 响应式系统与 React
      • React学习小记
      • Redux学习之Redux三原则、createSore原理及实现
    • Vue
    • TypeScript
      • TypeScript入门
      • TypeScript 类型体操练习
        • Easy题(13/13)
        • Middle(20/72)
    • 前端工程化
      • Webpack知识体系
    • Node
    • 前端动画与绘图
      • WebGL基础
      • 前端动画简介
      • Floating UI 使用经验分享 - Popover
      • Floating UI 使用经验分享 - Dialog
      • Three.js 学习
        • 学习记录
        • 资源记录
    • 前端性能优化
    • 跨端
      • RN 学习小记之使用 Expo 创建项目
    • 开源
    • SEO 优化
      • 搜索引擎优化 (SEO) 新手指南笔记
  • 笔面试记录
    • 面经集锦
      • 2022春暑期实习MetaApp一二面面经
      • 2022春暑期实习字节前端一面凉经
    • 笔试复盘
      • 2022春暑期实习-美团前端-笔试
      • 2022春暑期实习-360前端-笔试(AK)
      • 2022春暑期实习-京东前端-笔试
      • 2022春暑期实习-网易雷火前端-笔试(AK)
      • 2022春暑期实习-网易互联网前端-暑期实习笔试
由 GitBook 提供支持
在本页
  • 什么是Webpack
  • Webpack打包核心流程
  • 理解Loader
  • 理解插件Plugin
  • 如何学习Webpack
  • 总结感想
  • Q&A

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 前端进阶
  2. 前端工程化

Webpack知识体系

【第二届青训营-寒假前端场】- Webpack知识体系

上一页前端工程化下一页Node

最后更新于3年前

这有帮助吗?

  • 理解Webpack的基本用法

  • 通过介绍Webpack功能、Loader 与Plugin组件设计,建立一个知识体系

  • 不会事无巨细,介绍Webpack所有

  • 也不是深入源码,讲解底层实现原理

什么是Webpack

前端项目由什么构成? —— 资源

image.png

旧时代手动管理这些资源,但有以下几个对开发效率影响非常大的缺点:

  • 依赖手工,比如有50个JS文件……操作过程繁琐

  • 当代码文件之间有依赖的时候,就得严格按依赖顺序书写

  • 开发与生产环境一致,难以接入TS或JS新特性

  • 比较难接入Less、Sass等工具

  • JS、 图片、CSS资源管理模型不一致

后来,出现了很多前端工程化工具,特别是Webpack

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

  • 多份资源文件打包成一个Bundle

  • 支持

    • Babel、Eslint、 TS、 CoffeScript、Less、 Sass

  • 支持模块化处理css、图片等资源文件

  • 支持 HMR + 开发服务器

  • 支持持续监听、持续构建

  • 支持代码分离

  • 支持 Tree-shaking

  • 支持 Sourcemap

  • ...

Webpack打包核心流程

示例

  1. 安装(注意用管理员权限打开命令行)

    npm i -D webpack webpack-cli
  2. 编辑配置文件webpack.config.js

    module.exports = {
        entry: 'main.js',   // 定义当前项目的入口文件
        output: {   // 定义当前项目的输出文件
            filename: "[name].js",
            path: path.join(__dirname, "./dist"),
        },
        module: {// 定义一些loader相关的内容,可在下文看到
            rules: [{
                test: /\.less$/i,
                use: ['style-loader', 'css-loader', 'less-loader']
            }]
        }
    }
  3. 执行编译命令

    npx webpack

步骤

Entry => Dependencies Lookup => Transform => Bundle => Output

极度简化版:

  1. 从entry中的入口文件开始启动编译

  2. 依赖解析:根据require 或者 import 等语句找到以来资源

  3. 根据module 配置,调用资源转移器将非JS资源编译为JS内容,直至所有资源处理完毕

  4. 资源合并打包:将转译后的资源内容合并打包为可直接在浏览器运行的JS文件

模块化 + 一致性

  • 多个文件资源合并成一个,减少http请求数

  • 支持模块化开发

  • 支持高级JS特性

  • 支持Typescript、 CoffeeScript 方言

  • 统一图片、CSS、字体等其它资源的处理模型

  • Etc...

关键配置项(如何使用?)

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

  • 流程类:作用于流程中某个or若干个环节,直接影响打包效果的配置项

  • 工具类:主流程之外,提供更多工程化能力的配置项

ps:官网文档确实,看不太懂()

配置总览:

按使用频率,主要有以下几大配置项

  • entry/output——程序输入输出,必需的

  • module/plugins

    • 如图,比如我这个项目需要加载less文件,需要导入以下loader等

  • mode

  • watch/devServer/devtool

使用Webpack处理CSS/less等

  1. 安装Loader

    npm add -D css- Loader style-loader
  2. 添加module处理css文件

思考题

  • Loader有什么作用?为什么这里需要用到css-loader、style-loader

  • 与旧时代,在HTML文件中维护CSS 相比,这种方式会有什么优劣处?

  • 有没有接触过Less、Sass、 Stylus 这一类CSS预编译框架?如何在Webpack接入这些工具?

    • 答:接触过less

参考资料:

使用Webpack接入Babel

  1. 安装依赖

    npm -D @babel/core @babel/preset-env babel-loader
  2. 声明入口 entry & 产物出口output

  3. 添加module处理css文件

    module:{
        rules:[
        {
            test:/\.js?$/,
            use:[{
                loader: 'babel-loader',
                options: {
                    presets: [
                        [
                            '@babel/preset-env'
                        ]
                    ]
                }
            }]
        }
    ]
    }
  4. 执行 npx webpack

思考题

  • Babel具体有什么功能

  • Babel与Webpack分别解决了什么问题?为何两者能协作到一起了?

参考资料:

使用Webpack生成html

  1. 安装依赖

    npm i -D html-webpack-plugin
  2. 配置

const path = require( ”path");
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
   entry: "./src/index",
   output: {
       filename:“ [name]. js",
       path: path.join(__dirname, "./dist"),
   },
   plugins: [new HtmlWebpackPlugin()]
};
  1. 执行npx webpack

思考题

  • 相比于手工维护HTML内容,这种自动生成的方式有什么优缺点?

参考资料:

使用Webpack——HMR

Hot Module Replacement——模块热替换(写的代码会被立刻更新到浏览器上~)

  1. 开启HMR

    module.exports={
    	// ...
    	devServer: {
            hot:true; // 必需
        }
    };
  2. 启动webpack

使用Webpack——Tree-Shaking

Tree-Shaking -树摇,用于删除Dead Code

Dead Code

  • 代码没有被用到,不可到达

  • 代码的执行结果不会被用到

  • 代码只读不写

Tree-Shaking

  • 模块导出了,但未被其他模块使用

开启步骤?

  • mode: "production"

  • optimization: {usedExports: true}

  module.exports = {
  	entry: "./src/ index",
  	mode: "production",
  	devtool: false,
  	optimization: {
  		usedExports: true, 
  	},
  };

ps:对工具类库如Lodash有奇效,能大大减小产物体积

其他工具

  • 缓存

  • Sourcemap (前面的课程中有提过)

  • 性能监控

  • 日志

  • 代码压缩

  • 分包

  • ...

思考题

  • 除上面提到的内容,还有哪些配置可划分为“流程类” 配置?

  • 工具类配置具体有什么作用?包括 devtool/cache/stat 等

理解Loader

Loader核心功能:将非JS资源转换为JS资源

  1. 安装Loader

    npm add -D css-loader style-loader less-loader
  2. 添加module处理less文件

module.exports = { 
    module: {
        rules: [
            {
                test: /\.less$/i,
                use:[
                    "style-loader",
                    "css-loader",
                    "less-loader",
                ],
            },
        ],
    },
};

认识Loader:链式调用

  • less-loader: 实现less => css的转换

  • css-loader: 实现css => js的转换,将CSS包装成类似module.exports = "${css}" 的内容,包装后的内容符合JavaScript 语法

  • style-loader:将css模块包进require语句,并在运行时调用injectStyle等函数将内容注入到页面的style标签

认识Loader:其他特性

特点

  • 链式执行

  • 支持异步执行

  • 分normal、pitch两种模式

module.exports = function(source, sourceMap?, data?) {
	// source 为loader的输入
	//可能是文件内容,也可能是上一个loader处理结果
	return source;
};

常用Loader

  • 站在使用角度,建议掌握这些常见Loader的功能、配置方法

思考题

  • Loader输入是什么?要求的输出是什么?

  • Loader的链式调用是什么意思?如何串联多个Loader?

  • Loader中如何处理异步场景?要抛一个异常的话要怎么抛

理解插件Plugin

什么是插件

  • 很多知名工具,如:

    • VS Code、Web Storm、Chrome、Firefox

    • Babel、Webpack、 Rollup、 Eslint

    • Vue、Redux、 Quill、 Axios

  • 等等,都设计了所谓"插件”架构,为什么?

插件可以提升整个应用的拓展性

假设一个应用没有任何插件,整一个就是特别复杂的过程,那么:

  • 新人需要了解整个流程细节,上手成本高

  • 功能迭代成本高,牵一发动全身

  • 功能僵化,作为开源项目而言缺乏成长性

心智成本高 => 可维护性低 => 生命力弱 插件架构精髓:对扩展开放,对修改封闭,其实就是开闭原则

甚至,Webpack本身的很多功能也是基于插件实现的

如何编写插件

首先:插件围绕 钩子 展开

class SomePlugin {
    apply(compile) {
    	compiler.hooks.thisCompilation.tap('SomePlugin', (compilation) => {
    	})
    }
}

钩子

  1. 时机:编译过程的特定节点,Webpack会以钩子形式通知插件此刻正在发生什么事情;

  2. 上下文:通过tapable提供的回调机制,以参数方式传递上下文信息;

  3. 交互:在上下文参数对象中附带了很多存在side effect的交互接口,插件可以通过这些接口改变

    时机:compier.hooks.compilation

    参数:compilation等

    交互:dependencyFactories.set

思考题

  • Loader与插件有什么区同点?

  • "钩子“有什么作用?如何监听钩子函数?

参考资料:

如何学习Webpack

入门级:学会灵活应用

  • 理解打包流程

  • 熟练掌握常用配置项、Loader、 插件的使用方法,能够灵活搭建集成Vue、React、 Babel、 Eslint、 Less、 Sass、 图片处理等工具的Webpack环境

  • 掌握常见脚手架工具的用法,例如: Vue-cli、 create-react- app、@angular/cli

进阶:学会扩展Webpack

  • 理解Loader、 Plugin机制,能够自行开发Webpack组件

  • 理解常见性能优化手段,并能用于解决实际问题

  • 理解前端工程化概念与生态现状

大师:源码级理解Webpack打包编译原理

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

总结感想

Q&A

Q:面试要掌握到什么程度

A:网上很多面试主要围绕三种主题

  • Loader有什么作用?怎么写loader?常用loader有哪些

    • 常用loader:css-loader、style-loader、vue-loader、file-loader、eslint-loader、babel-loader等

  • 插件有什么用?怎么写插件?编译原理?

  • Bundle、chunk、module分别是什么含义?

本文引用的大部分内容来自范文杰老师的课,欢迎关注老师的公众号:Tecvan

image.png

image.png
image.png

image.png

原理可参考:

image.png

参考:

image.png
image.png
image.png
image.png

image.png

这节课详细讲了Webpack的Webpack的作用、配置结构及其关键配置项,还讲了Loader中的链式调用、插件的实现原理与一些其他特性等,可以看出老师对Webpack的研究非常详细透彻,课上都是直接进行调试进入loader内部等帮助我们理解。老师还总结了Webpack知识体系:。

一些资源:

Webpack配置官方文档
Css-loader
Webpack 原理系列七:如何编写loader
Style-loader
Babel-loader
Babel官网
@babel/preset-env
@babel/preset-react
@babel/preset-typescript
HtmlWebpackPlugin
Webpack 原理系列十:HMR 原理全解析 (qq.com)
Webpack 原理系列七:如何编写loader (qq.com)
一文吃透 Webpack 核心原理
Webpack 插件架构深度讲解
Webpack 5 知识体系 - GitMind
深入浅出 Webpack
image.png
image.png
image.png