插件系统概述
插件系统的高级概述

Parcel 架构
#即使您没有做任何复杂的事情,如果您经常使用 Parcel,花些时间了解它的工作原理是很有意义的。
实体
#- 资源:在最简单的情况下,资源对应于一个源文件(例如磁盘上的 TypeScript 文件)。然而,转换器不仅可以修改(转换)资源,还可以为单个输入资源返回多个资源。
- 依赖:依赖模型表示一个资源请求另一个资源(例如 JavaScript 中的
import "foo";
声明,或 HTML 中的<link rel="stylesheet">
)。它们由转换器显式添加(有时称为出站依赖)。此外,Parcel 还跟踪这些依赖指向的资源,并将此信息公开为资源的入站依赖(从而列出某些资源的导入者)。 - 打包:打包是将资源分组并写入浏览器可加载的单个文件的过程。异步打包是为延迟依赖(例如
import()
调用)创建的打包,共享打包包含多个其他打包使用的资源,并为提高加载性能而分离。
Parcel 的阶段
#在高层次上,Parcel 经历了几个阶段:
- 解析
- 转换
- 打包
- 命名
- 打包
- 优化
- 压缩
解析和转换阶段并行工作,以构建所有资源的图。
资源在打包阶段被分组到打包中。每个打包的输出文件名在命名阶段确定。
然后,打包、优化和压缩阶段并行工作,以生成每个打包的最终内容。
打包阶段将每个打包中的资源合并到输出文件中。
优化阶段转换每个打包的内容。完成后,Parcel 确定每个打包的内容哈希,这些哈希将应用于最终输出文件名。
最后,压缩阶段在将文件写入文件系统时为每个输出文件生成一个或多个编码。
资源图
#在解析和转换阶段,Parcel 发现应用或程序中的所有资源。每个资源都可以对其他资源有自己的依赖,Parcel 将提取这些依赖。
表示所有这些资源及其相互依赖关系的数据结构称为"资源图"。
打包图
#一旦 Parcel 构建了整个资源图,它就将其转换为打包图,打包图包含资源图,并额外描述应将哪些资源分组到打包中(以及这些打包之间的关系)。
某些资源被视为应用的"入口"点,并将保持为单独的打包。例如,如果您的 index.html
文件链接到 about.html
文件,它们不会合并在一起。
插件类型完整列表
#- 转换器:将资源转换为(另一个)资源
示例:将 TypeScript 转换为 JavaScript(每个文件) - 解析器:将依赖请求转换为绝对路径(或排除它们)
示例:为导入添加自定义语法,如import "^/foo"
- 打包器:将资源图转换为打包图
示例:创建一个进行供应商打包的打包器(拆分应用和 node_modules 代码) - 命名器:为打包生成文件名(或文件路径)
示例:将输出打包放在分层文件结构中,省略打包名称中的哈希 - 运行时:以编程方式将(合成)资源插入打包
示例:为每个打包添加分析 - 打包器:将一组资源(打包)转换为打包文件
示例:将所有输入的 CSS 文件连接到一个 CSS 打包中 - 优化器:对已完成的打包应用修改(类似于转换器)
示例:运行压缩器或转换为内联使用的数据 URL - 压缩器:以一种或多种方式压缩或编码打包
示例:使用 Gzip 压缩打包 - 验证器:分析资源并发出警告和错误
示例:进行类型检查(TypeScript、Flow) - 配置:可重用的 '.parcelrc' 包
示例:为您的样板提供量身定制的 Parcel 配置 - 报告器:监听构建事件
示例:生成打包报告,运行开发服务器