背景
随着前端项目复杂度的不断提升,项目启动速度逐渐变慢已成为一个亟待解决的问题。以 Webpack 为例,随着项目规模的扩大,其在构建方面的痛点愈发凸显,尤其是构建速度过慢的问题。这主要源于两方面原因:一是在项目冷启动时,Webpack 需要递归打包整个项目的依赖树,这个过程耗时较长;二是 JavaScript 语言本身的特性(如解释执行、单线程执行)限制了构建性能的提升,导致构建过程遇到瓶颈。
在这样的背景下,诸如 Snowpack、Vite 等 Bundleless(或无捆绑)构建工具应运而生,为前端开发带来了新的可能性。Bundleless 和传统的构建工具相比,最大的特点就是不用将业务代码打包,在项目逐渐庞大的时候,可以极大地提升构建效率和开发体验。
特点
- Bundleless 无需打包,直接使用原生的 ES Module 规范进行开发,浏览器直接加载各个模块,打包冷启动时间大大缩短。
- HMR 速度也很快,因为只需要加载修改后的文件。
- 单位件粒度缓存更优。
- 不依赖 source map,调试更方便。
优势与不足
优势:
- 项目启动快。因为不需要过多的打包,只需要处理修改后的单个文件,刷新即可即时生效,速度很快。
- 浏览器加载块。利用浏览器自主加载的特性,跳过打包的过程。
- 本地文件更新,重新请求单个文件。
不足:
- 单位件仍然需要编译,时长仍然很长。
- 请求数量增加,加载性能问题。
- 生产环境构建稳定性待提高。项目的请求数量和请求深度问题都不可控,因此生产环境一般不采用 Bundleless 构建(为了在生产环境中获得最佳的加载性能,最好还是将代码进行 tree-shaking、懒加载和 chunk 分割)。
Vite
在开发环境中,基于 Esbuild 打包外部依赖,浏览器直接请求 ESM 模块文件。
- 使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。
- 以 原生 ESM 方式服务源码。这实际上是让浏览器接管了打包程序的部分工作,Vite 只需要在浏览器请求源码时进行转换并按需提供源码。
生产环境下直接使用 Rollup 进行打包。
更多见官方文档