Parcel v2.15.0
Parcel v2.15.0 引入了一个用 Rust 实现的 HTML 和 SVG 的新转换器和压缩器,使用了来自 Firefox 和 Servo 的浏览器级组件。它还将 npm 依赖数量减少了 25%,并将已安装的 node_modules 大小减少了 45%。
新的 HTML 转换器
#自 Parcel 第一个版本以来,我们的 HTML 转换器一直依赖于 posthtml。这为解析和转换 HTML 提供了一个插件生态系统,包括 htmlnano 压缩器。
随着工具迁移到 Rust 和其他原生语言的持续进行,是时候为 Parcel 构建一个新的 HTML 转换器了。Rust 使我们能够重用浏览器中经过实战检验的高质量组件,就像我们为 CSS 使用 Lightning CSS 一样。新的 HTML 转换器使用 Servo 的 html5ever 解析器。(正确的)HTML 解析是出了名的困难。规范中描述了大量的边缘情况和错误处理规则(规范超过 100 页打印文档!),这是经过几十年发展形成的。使用浏览器级解析器确保 Parcel 可以像浏览器一样处理任何 HTML 文档。
解析 HTML 后,Parcel 遍历 DOM 以查找依赖项,如图像、链接、视频、元标签等。此外,还会收集内联的 <script>
和 <style>
标签。处理这些后,HTML 将使用每个资源的最终 URL 或内容进行更新。
最后一步是压缩。HTML 压缩非常棘手。在大多数情况下,删除空白甚至是不安全的。例如,CSS 样式表可能应用了 white-space: pre
,这将保留元素之间的换行符和空白。现在,Parcel 在压缩时更加保守,优先考虑正确性而非文件大小。然而,HTML 的其他部分的压缩现在已得到改进。例如,可以从属性中删除引号,可以省略布尔属性值,并且可以删除可选的闭合元素(利用 HTML 的错误恢复机制)。
PostHTML 仍然被支持。当检测到 .posthtmlrc
文件时,它将像以前一样应用。此外,新的压缩器与 htmlnano 配置文件中的许多选项兼容。如果需要,您仍可以通过将 @parcel/optimizer-htmlnano
添加到 .parcelrc
来继续使用 htmlnano。
SVGO → OXVG
#OXVG 是由 Noah Baldwin 编写的基于 Rust 的 SVGO 替代品。它与 SVGO 配置文件高度兼容,性能提高了数倍,并且正确性更高。它使用 Lightning CSS 优化 SVG 文件中的样式,并使用 html5ever 解析器生成的相同 AST 处理 HTML 中的嵌入式 SVG。
您的 svgo.config.json
文件将继续被 OXVG 使用。如果您有自定义插件,或需要 OXVG 尚未支持的功能,可以将 @parcel/optimizer-svgo
添加到 .parcelrc
以恢复使用 SVGO。
SVG 转 JSX
#使用上面描述的相同解析和优化步骤,Parcel 还支持将 SVG 转换为 JSX,例如将图标导入为 React 组件。@parcel/transformer-svg-jsx
插件替换了使用 SVGR 的 @parcel/transformer-svg-react
。Parcel 现在直接将解析后的 SVG DOM 结构转换为 SWC JavaScript AST。
新的 SVG 转 JSX 转换器支持 svgr.config.json
文件中的大多数选项。如果您有自定义插件,可以继续使用 @parcel/transformer-svg-react
。
减少安装占用
#新的 HTML 和 SVG 插件使我们能够将 Parcel 在 node_modules 中的大小减少 45%,并将已安装的依赖数量减少 25%。在此版本中,我们还将原生二进制文件拆分为每个架构的单独包。这意味着您需要更新和维护的内容更少,并且应该会导致更快的安装。
感谢!
#感谢所有为此版本做出贡献的人!查看完整的更新日志以了解所有其他错误修复和改进。