对于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学习-工作原理(上)相关推荐

  1. 【图像处理】数码相机工作原理完整解析

    在过去二十年里,消费电子产品的大多数重要技术突破实际上可归结于一项更大意义上的科技革命.仔细观察就会发现,CD.DVD.高清电视.MP3和DVR其实都是基于相同的原理,即:将传统的模拟信息转变为数字信 ...

  2. Robotframework 的简介及其工作原理~

    下面通过官网和网上资料来简单介绍下Robotframework及其工作原理. 官方说明: Robot Framework is a generic test automation framework ...

  3. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    关键词: android  camera CMM 模组 camera参数  CAMIF 平台信息: 内核: linux 系统: android 平台:S5PV310(samsung exynos 42 ...

  4. springMVC 的工作原理和机制

    转载自 https://www.cnblogs.com/zbf1214/p/5265117.html 工作原理 上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器, ...

  5. 音圈电机工作原理与直线电机的对比

    图片来自:什么是音圈电机?如何工作的?如何应用于相机镜头调焦? - 知乎 目录 1. 什么是音圈? 2.音圈电机(VCM,Voice Coil Motor)结构及原理 2.1 音圈电机工作原理 2.2 ...

  6. Spring MVC的工作原理和机制

    Spring  MVC的工作原理和机制 参考: springMVC 的工作原理和机制 - 孤鸿子 - 博客园 https://www.cnblogs.com/zbf1214/p/5265117.htm ...

  7. 在4G网络下GPS定位器汽车进行动力控制(断油断电)工作原理

    4G网络下,GPS定位器对汽车的控制主要是针对动力的开闭或者汽车油门泵的继电器的控制,要求GPS定位设备必须带有4G网络.GPS+北斗定位信息,内置继电器可以对外控制闭合开关. 工作原理上,不是真正的 ...

  8. bmp180气压传感器工作原理_氢气传感器的的工作原理

    原标题:氢气传感器的的工作原理 氢气是一种看不见.闻不到.没有气味的易燃.易爆气体.在我们的生产生活中,有一些场所容易发生氢气释放和泄漏,通过使用氢气监测设备,对空气中的氢气浓度进行实时监测. 氢气传 ...

  9. bmp180气压传感器工作原理_氢气传感器的工作原理及特点

    原标题:氢气传感器的工作原理及特点 氢气是一种无色无味的易燃易爆气体,人的眼睛和鼻子很难及时发现.在一些容易发生氢气泄漏的场所,若没有及时发现泄漏,当氢气在空气中达到一定浓度时,遇到火源就会发生爆炸, ...

  10. 【学习】Android中View的工作原理(上)——ViewRoot、DecorView、MeasureSpec

    初识ViewRoot和DecorView ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot完成 ...

最新文章

  1. ID--HANDLE--HWND三者之间的互相转换(转)
  2. numpy笔记:random.permutation
  3. Java Review - 并发编程_锁的分类
  4. skill alpha protocol
  5. matlab 泡泡图,使用matlab绘制2维、3维气泡图
  6. Toad for Oracle9.7中导入数据库以后,数据有中文乱码:
  7. layui设置radio
  8. 微信小程序预览pdf功能实现
  9. redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
  10. 【LeetCode】【refine 3】题号:*3. 无重复字符的最长子串
  11. java json 反序列化_java-如何将json字符串反序列化为对象
  12. Linux x86-64 IOMMU详解(一)——IOMMU简介
  13. 推荐2款优秀的代码截图工具
  14. 利用SQL求中位数(已修复BUG)
  15. 网站自动回复客服源码
  16. C++笔试笔记1(4399 西山居 深信服 剑心互娱 快手)
  17. CCF A类会议或期刊----多视图聚类近两年论文
  18. 二叉树:给后序中序遍历,求前序
  19. Mac M1系统 miniconda安装、配置conda环境,及在conda环境中安装激活QIIME2
  20. 你打英雄联盟or王者荣耀为什么老是匹配到怨种队友,进来看

热门文章

  1. 这样的烂代码,我实习的时候都写不出来!
  2. 后疫情时代下,企业数字化转型之路如何走?
  3. PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)
  4. MIT公布“著名黑客之死”调查报告
  5. Linux 第70天 mariadb transaction, log
  6. ES6新增的let与const
  7. 构建虚拟工控环境系列 - 西门子虚拟PLC
  8. SQL语句技巧:查询时巧用OR实现逻辑判断
  9. 一个简单的 Python-kivy 小程序
  10. Python模块包中__init__.py文件的作用