关于 Webpack 使用 Babel 与 Vite 使用 ESBuild 的一些思考

关于 Webpack 使用 Babel 与 Vite 使用 ESBuild 的一些思考
Photo by Dean Pugh / Unsplash

虽然 Vite 是基于 esbuild 构建的,并且 esbuild 在构建速度上有显著优势,但 Webpack 目前并没有直接使用 esbuild 构建的原因涉及多个方面,主要是 架构设计差异功能需求兼容性 等问题。下面是一些关键的原因:

1. Webpack 的复杂性与扩展性

Webpack 的高度可扩展性:Webpack 的设计目标是一个 高度可配置和可扩展的打包工具。它提供了丰富的插件和 loader 机制,支持各种复杂的构建需求(如代码分割、热更新、各种资源处理等)。这些功能要求 Webpack 必须具备更细粒度的控制能力,而 esbuild 的设计理念相对简化,主要关注高速构建和基本的模块转换功能。

Loader 和 Plugin 系统:Webpack 的强大之处在于其 loaderplugin 系统,允许开发者定制几乎每一个构建步骤。虽然 esbuild 也支持一些插件,但它的插件系统远不如 Webpack 灵活。因此,迁移到 esbuild 后,可能需要做大量的改造工作,甚至失去 Webpack 的一些优势。

2. 功能差异与优化目标

构建优化的侧重点不同

Webpack 专注于处理复杂的构建需求,如按需加载、动态导入、复杂的资源处理(比如 CSS、图片、字体的优化等)。它支持各种构建优化,包括代码分割、懒加载、tree shaking 等,能让大型应用的构建更加灵活和高效。

esbuild 的目标是 极致的构建速度,它的设计更注重 原生支持 JavaScript 的转换,例如将 TypeScript 转换为 JavaScript、代码压缩和模块解析。虽然 esbuild 对一些任务(如构建速度和压缩)有显著优势,但它缺少 Webpack 在处理资源、插件和复杂构建逻辑时的深度定制能力。

功能集成:Webpack 本身不仅仅是一个打包工具,它提供了许多内置的功能,例如 HMR(热模块替换)、代码拆分、模块联邦(Module Federation)等,这些功能是通过复杂的插件和中间件机制实现的。而 esbuild 在设计时并没有考虑这些功能,它专注于打包和转译,因此在 Webpack 中实现这些高级功能时,可能无法直接依赖 esbuild。

3. 插件和生态差异

Webpack 生态系统:Webpack 拥有一个庞大的插件生态,很多前端开发中的功能(例如代码压缩、图片优化、CSS 预处理器等)都有现成的插件支持。而 esbuild 的插件生态相对较新,虽然也在快速发展,但与 Webpack 的成熟生态相比,仍有一定差距。如果 Webpack 完全迁移到 esbuild,它就可能失去很多现有插件的支持,尤其是在处理复杂资源和高级功能时。

兼容性问题:Webpack 需要兼容各种不同的加载器(如 Babel、Sass、TypeScript 等)和插件,这需要一个高度灵活的架构。esbuild 虽然在速度上表现优秀,但它的插件和配置机制相对简化,在一些场景下可能无法满足 Webpack 的需求,尤其是当涉及到复杂的资源处理和定制化构建时。

4. 逐步优化与平衡

兼容性和迁移成本:虽然 esbuild 提供了高效的构建速度,但 Webpack 在项目中积累了大量的配置和插件,因此如果完全转移到 esbuild,可能需要对现有的构建系统进行大规模的改造。这不仅会导致迁移成本高,还可能影响现有项目的稳定性。

性能优化方式不同:Webpack 更倾向于通过 增量构建、缓存、代码分割等手段 来优化构建性能,而 esbuild 是通过 极度优化的构建引擎 来加速构建。这两者的优化方式不同,所以即便 esbuild 在某些任务上有明显优势,Webpack 仍然通过其他手段保持其在大型项目中的高效性。

5. 未来可能的结合

• 虽然 Webpack 目前没有使用 esbuild 作为构建核心,但 Webpack 5+ 实际上已经在某些构建任务中开始 集成 esbuild,特别是在 JavaScript 和 TypeScript 编译的速度上。例如,Webpack 通过 esbuild-loader 插件,允许开发者在 Webpack 中使用 esbuild 作为 JavaScript 编译器,以加快构建速度。这是两者结合的一个例子,通过结合 Webpack 的灵活性与 esbuild 的高性能,开发者可以获得更好的构建体验。

未来可能的整合方向:Webpack 和 esbuild 各自有自己的优势,未来可能会有更多的集成方式,将 esbuild 的速度优势和 Webpack 的功能性优势结合起来,既保留 Webpack 的扩展性,又能利用 esbuild 的构建速度。

总结

Webpack 和 esbuild 的设计目标和功能重点不同:Webpack 侧重于灵活性、功能丰富的构建系统,适用于复杂的项目需求;而 esbuild 则专注于极致的构建速度和基本的模块转换,因此两者在架构和实现上存在差异。

Webpack 目前并不直接使用 esbuild,是因为它需要处理更多复杂的构建任务和插件生态,而 esbuild 在这些方面还不如 Webpack 灵活。

• 然而,Webpack 可以通过插件如 esbuild-loader 集成 esbuild,从而在不完全迁移的情况下,享受 esbuild 提供的高效构建性能。

因此,虽然目前 Webpack 并不完全基于 esbuild 构建,但未来可能会继续整合 esbuild 的优势,同时保持 Webpack 的灵活性和强大的插件支持。

Read more

从事 SEO 12 年的大佬总结的要点

从事 SEO 12 年的大佬总结的要点

从事 SEO 12 年后,以下是我能想到的所有 SEO 技巧: 1. 在 H1、H2 和 URL 部分中使用主要关键词。 2. 停止追逐虚荣指标。流量固然重要,但转化率才是最重要的。 3. 内部链接可以将“几乎完成”的页面转变为表现最佳的页面。 4. 定期检查你的网站是否有坏链接,这是一个简单的 SEO 胜利。 5. Google Search Console 是您最好的朋友,使用它来重新优化排名在第 3-7 位的页面。 6. 90% 的反向链接应来自相关的高权威网站。 7. 速度决定一切——或许应该说,速度不足会扼杀一切。确保加载时间在 2 秒以内。 8. 持续更新内容将帮助你的页面保持更高的排名。 9. 使用 NLP

Pnpm 构建 Monorepo

Pnpm 构建 Monorepo

最近开始搭建 monorepo 的项目,了解到以下方案: * lerna 有强大完善的依赖管理和构建、打包发布流程,而且 v5 版本将 nx 与 lerna 整合了,提升了性能和速度 * 业界大多使用 lerna + yarn workspace 的方式来管理,yarn 用来管理依赖,lerna 用于管理发布 之前简单使用过 lerna ,不过再加上 yarn workspace , 学习容多、配置多又得折腾,太费劲🤪,暂时搁置。 最终尝试使用单一的 pnpm workspace + changesets 的方式来构建 monorepo,本身我就使用 pnpm 作为包管理工具,目前我的场景简单,pnpm 就已足够。 本文记录自己使用 pnpm workspace 搭建 monorepo

HTTP Web 缓存总结

HTTP Web 缓存总结

友情提示:缓存什么的,是完全依赖相关http header头信息来标记和判断的 缓存读取顺序: 首先读取本地缓存,如果条件满足就取本地缓存,否则往后走代理缓存,同理,条件满足就是从代理缓存取资源(可能存在多级代理缓存) 如果一条链路上的资源都不符合,那么就去源服务器获取 缓存优先级:Cache-Control > Expires > Etag > Last-Modified 缓存的分类和优先级 * 强缓存 状态码 200 (比如 200 (from cache)) * Expires 服务器下发的绝对时间,而判断的时候以浏览器时间为准,客户端和服务器有可能会不一样 * Cache-Control 相对时间,以客户端相对时间为准 * 协商缓存 状态码 304 * Last-Modified If-Modified-Since * Etag If-None-Match 强缓存优先级高于协商缓存,强缓存不会询问服务器,直接使用缓存。协商缓存会询问服务器关于文件的可用性 对于传输过程中的中间节点,本文都称为代理服务器,包括proxy、

Dokploy 一键部署 Plausible

Dokploy 一键部署 Plausible

Plausible 是一款与 Google Analytics 类似的 Web 流量分析工具,相比 Google Analytics 对比如下: * 功能复杂度:GA 功能更强大,适合需要深入分析的用户;Plausible 提供基础的流量分析,简单易用。 * 自托管:Plausible 可以自托管,GA 不支持;GA 存储数据在 Google 服务器上。 * 性能:Plausible 更轻量,只有几 KB,加载更快;GA 可能影响网站性能。 * 隐私保护:Plausible 更注重隐私,不追踪用户数据;GA 会使用 cookies 并可能共享数据给 Google。 我是用 Plausible 来监控我的个人的一些站点,这里使用 Dokploy 来一键部署