Webpack学习-工作原理(上)
对于webpack的认识始终停留在对脚手架的使用,不得不说脚手架既方便又好用,修改起来也方便,只需要知道webpack中各个配置项的功能,于是对于我们来说,webpack始终就是一个黑盒子,我们完全不清楚里面是如何去运作的。打包时报错,就只能借助google来协助帮忙解决问题,至于为什么要这样解决,什么原理,不管,能解决就好。那么,了解一下基本原理也是有必要。
概念
言归正传,我们一起了解一下webpack运行基本原理,首先先明白几个核心概念,
- Entry:入口,webpack构建的起始
- Module:模块,webpack里面一切皆模块,也是代表着文件,从Entry配置的入口文件开始,递归找出依赖的模块
- Chunk:代码块,找出递归依赖模块经转换后组合成代码块
- Loader:模块转换器,也就是将模块的内容按照需求装换成新内容
- Plugin:扩展插件,webpack构建过程中,会在特定的时机广播对应的事件,而插件可以监听这些事件的发生
流程
webpack构建流程,详细过程如下:
- 初始化:从配置文件或是shell读取与合并参数,得到最终参数,实例化插件new Plugin()
- 开始编译:通过上一步初始化得到的最终参数,初始化一个Compiler对象,加载插件(依次调用插件中的apply方法),通过执行Compiler.run开始编译
- 确定入口:根据配置中entry找出所有入口文件
- 编译模块:从entry出发,调用配置的loader,对模块进行转换,同时找出模块依赖的模块(如何找?见下文),依次递归,直到所有依赖模块完成本步骤处理
- 完成模块编译:这一步已经使用loader对所有模块进行了转换,得到了转换后的新内容以及依赖关系
- 输出资源: 根据入口与模块之间的依赖关系,组装成一个个chunk代码块,并且生成文件输出列表
- 输出成功:根据配置中的输出路径和文件名,将文件写入文件系统,完成构建
事件
整个构建流程会发生很多的事件,来供Plugin监听,这些事件具体的可以分为三个阶段,分别是初始化阶段、编译阶段、输出阶段,那么具体有哪些事件,这里按阶段分别介绍,
初始化阶段
| 事件 | 作用 |
|---|---|
| 初始化 | 从配置文件或是shell读取与合并参数,得到最终参数,依次实例化插件new Plugin() |
| 实例化Compiler | 通过上一步初始化得到的最终参数,初始化一个Compiler对象,负责监听文件和启动编译,全局只有一个Compiler对象 |
| 加载插件 | 依次调用插件中的apply方法,同时也会将Compiler实例传入,就可以调用Webpack提供的api,Compiler实例可以说是就是Webpack的实例 |
| environment | 将node.js风格的文件系统应用到compiler对象,便可以直接通过compiler来对文件进行操作 |
| entry-option | 读取配置中的entry,依次实例化出对应EntryPlugin,为后面该entry的递归解析工作做准备 |
| after-plugins | 调完所有内置和配置的插件的apply方法 |
| after-resolvers | 根据配置初始化resolvers,resolvers负责在文件系统中寻找制定路径的文件 |
编译阶段
| 事件 | 作用 |
|---|---|
| run | 启动一次新的编译,调用Compiler.run() |
| watch-run | 和run类似,区别在于它是在监听模式下进行编译的,这个事件可以获取哪些文件发生了变化从而导致新的一次编译 |
| compile | 告诉插件新的一次编译即将启动,并且给插件带上compiler对象 |
| compilation | 每当检测到文件的变化,都会有一次新的compilation被创建,一个compilation对象包含了当前的模块资源、编译生成的资源、变化的文件等等的属性和方法,同时记住,在很多事件的的回调中都会将compilation传入,以便使用 |
| make | 一个新的Compilation创建完毕,那么就会从entry配置中开始读取文件,使用配置好的loader对文件进行编译,编译完后再找出文件依赖的文件,递归地去编译和解析 |
| after-compile | 一次Compilation执行完成 |
| invalid | 文件编译错误等异常触发该事件,不会导致webpack退出 |
Compilation的事件
| 事件 | 作用 |
|---|---|
| build-moudle | 使用对应的loader去转换一个模块 |
| normal-module-loader | 在用loader转换一个模块后,会使用acorn解析转换后的内容输出对应的抽象语法树(ast),以便webpack后面分析代码使用 |
| program | 从配置的入口开始,分析生成的ast,遇到require等导入语句时,便会将其加入依赖模块列表,并且对找出的依赖进行递归分析,最终可以弄清所有依赖关系 |
| seal | 所有模块及其依赖的模块都通过Loader转换完成,根据依赖关系生成chunk |
输出阶段
| 事件 | 作用 |
|---|---|
| should-emit | 所有需要输出的文件都生成,准备输出,询问哪些文件需要输出,哪些不需要输出 |
| emit | 确定好要输出哪些文件后,并执行文件输出,可以在这里获取和修改输出的内容 |
| after-emit | 文件输出完毕 |
| done | 完成一次完整的编译和输出流程 |
| failed | 编译和输出过程中运到异常,导致webpack退出,会直接到这个步骤,可以在这里获取具体原因 |
总结
Webpack是很好的前端资源加载和打包工具,在webpack里一切皆模块,很好地处理文件之间的依赖关系,这里我们介绍的是些理论性的知识,了解基本概念,知道整个流程是怎么样的,webpack是串行流水线运行的,工作期间会有很多广播事件,来供插件使用,这里我们介绍了各个阶段的事件以及作用,具体代码表示形式,后续文章会引入。
Webpack学习-工作原理(上)的更多相关文章
- Cstyle的UEFI导读:第18.0篇 NVRAM的工作原理(上)
虽有句话说的好,实用的东西记在脑子里.没有的记在笔记本上. 可是如今的信息量越来越大,并且随着时间的推移记忆力会越来越不可靠,所以仅仅好把近期工作之余看的一些东西记录下来,避免被迅速忘记.这里 ...
- springmvc工作原理和环境搭建
SpringMVC工作原理 上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServle ...
- Robotframework 简介及工作原理
下面通过官网和网上资料来简单介绍下Robotframework及其工作原理. 官方说明: Robot Framework is a generic test automation framework ...
- springMVC 的工作原理和机制
工作原理上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web. ...
- springMVC 的工作原理和机制(转)
工作原理上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web. ...
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
一.摄像头工作原理 上一篇我们讲了摄像头模组的组成,工作原理,做为一种了解.下面我们析摄像头从寄存器角度是怎么工作的.如何阅读摄像头规格书(针对驱动调节时用到关键参数,以GT2005为例). 规格书, ...
- 1 weekend110的NN元数据管理机制 + NN工作机制 + DN工作原理
第一天的笔记,是伪分布hadoop集群搭建, 后面是hadoop Ha的分布式集群搭建 第一天,是HDFS的shell操作 NN工作机制 里面是二进制 DN工作原理 上传完了之后,在hdfs的虚拟路径 ...
- 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
关键词:android camera CMM 模组 camera参数 CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...
- 170529、springMVC 的工作原理和机制
工作原理上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web. ...
- Spring MVC的工作原理和机制
Spring MVC的工作原理和机制 参考: springMVC 的工作原理和机制 - 孤鸿子 - 博客园https://www.cnblogs.com/zbf1214/p/5265117.html ...
随机推荐
- Redis的持久化
Redis的持久化有两种方式: RDB方式(默认支持):在指定的时间间隔内将内存中的数据集快照写入磁盘 优势 整个Redis数据库将只包含一个文件,对于文件备份来说是完美的,系统出现灾难性的故障时容易 ...
- C# 创建数据库和表
using (SqlCommand command2 = new SqlCommand("CREATE TABLE bases(id int IDENTITY(1, 1) PRIMARY K ...
- Oracle 12 Rman增量备份
增量备份 增量备份主要作用是仅复制自上次备份以来已更改的数据块.您可以使用RMAN创建数据文件,表空间或整个数据库的增量备份. 将增量备份作为策略的一部分的主要原因是: 用于基于增量更新备份的策略,其 ...
- radhat6.6上安装oracle12c RAC (二)
二.GI(Grid Infrastructure)安装 首先将安装包传到node1的目录 2.1 GI软件安装 2.1.1.解压安装包 #su - grid解压 GRID 到 GRID用户的$ORAC ...
- [c/c++] programming之路(26)、结构体
一.初始化字符串 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ...
- 你不知道的JS(3)来聊聊this
为什么要使用this?什么是this? 来看一段代码 function identify() { return this.name.toUpperCase(); } function speak() ...
- Linux 我的常用命令记录
Linux下复制粘贴快捷键 1. 在终端下: 复制命令:Ctrl + Shift + C 组合键. 粘贴命令:Ctrl + Shift + V 组合键. 2. 在控制台下: 复制命令:Ctrl + ...
- win10 右键添加“在此打开powershell”
计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\ 上图中的字符串,直接去下图中的位置复制过来就好
- Vue路由(组件)懒加载(异步)
传统的引入方式 import test from '@/components/test' { path: '/test', name: '测试页面', component:test }, 懒加载的方式 ...
- linux中查找(find、locate、which、whereis、grep)命令汇总、帮助命令(man、whatis、apropos、info、help)汇总
(一)find命令详解 find:功能:文件搜索: 语法:find[搜索范围][匹配条件]: 只要匹配条件完全符合才可以被显示,使用通配符*匹配条件*则可以显示匹配条件的所有目录,问号?匹配单个字符 ...