Vite知识体系 | 青训营

173 阅读8分钟

构建工具

自动化构建工具能够帮助前端开发者更高效地管理和处理各种资源,从而提高开发效率和项目质量。

前端通点:资源

随着前端发展,涉及到的资源是越来越多,如何搞笑快速的进行资源管理问题避无可避,正是由于传统的资源管理方式所带来的一系列弊端,推荐了构建工具的诞生。

模块化方案

其中,模块化方案可以帮助开发者以模块化的方式组织和管理代码,提供了模块加载方案,并兼容了不同的模块规范,例如ESM、CommonJs和UMD。 资源编译是指对高级语法进行编译,包括语法转译和高级语法转译。

语法转义

语法转译主要针对一些新语法,将其转换为兼容性更好的旧语法,以确保代码在不同浏览器环境中的正常运行。而高级语法转译是针对一些高级语法的转换,如Sass和TypeScript,将其转换为浏览器可以理解的语法。 资源加载是指加载和管理各种资源,如图片、字体和worker等。它可以帮助开发者更方便地使用和管理这些资源,以提高页面的加载速度和用户体验。 产物质量包括代码体积和代码性能。

方案

通过产物压缩和无用代码删除等方式,可以减小代码的体积,提高页面加载速度。同时,通过语法降级等方式,可以保证代码在不同环境中的性能和兼容性。 开发效率方面,热更新是非常重要的功能。它可以在代码修改后实时更新浏览器中的页面,提高开发者的开发效率和调试体验。

总结

构建工具可以帮助前端开发者更好地管理和处理各种资源,提高开发效率和项目质量。不同的构建工具提供了不同的功能和特性,开发者可以根据项目的需求选择适合的构建工具进行使用。

Vite是什么

Vite的概述

Vite是一个由尤雨溪(Evan You)创造的下一代前端开发工具,它的目标是通过利用现代浏览器原生 ES 模块、新的构建模型和即时服务的功能来改变前端开发的方式。Vite被设计成一个更快、更轻量级的构建工具,以提高开发效率和项目质量。

模块化的开发方式

Vite的核心理念是基于原生 ES 模块的开发。与传统的打包工具相比,Vite将每个单独的文件视为一个模块,而不是将整个项目打包成一个巨大的文件。这种模块化的开发方式使得在开发过程中只需要重新编译修改的文件,而不需要重新编译整个项目,从而极大地提高了开发的速度和效率。

浏览器原生模块加载

Vite利用浏览器原生支持的 ES 模块加载功能实现了更快的启动和重新加载速度。传统的打包工具需要将所有的模块打包成一个或多个大型的打包文件,而Vite直接在浏览器中加载模块,减少了重新加载的时间。这种浏览器原生模块加载的方式使得开发者可以在修改代码后实时查看更新的效果,提高了开发效率。

即时服务

Vite引入了即时服务的概念,它可以将源代码直接在浏览器中运行。这意味着开发者无需重新加载整个页面,即可实时预览代码的更新效果。即时服务在调试和实时预览方面非常有价值,提供了更快速和便捷的开发体验。

优化的构建结果

Vite支持优化的构建结果,可以自动对代码进行压缩、分割和懒加载等处理,以确保最终生成的代码质量和性能。通过优化的构建结果,Vite可以减小代码体积,提高页面加载速度,同时保证代码的质量和性能。

结论

总的来说,Vite是一个革命性的前端开发工具。它通过模块化的开发方式、浏览器原生模块加载、即时服务和优化的构建结果等特性,显著提升了前端开发的效率和体验。作为一个更快、更轻量级的构建工具,Vite为前端开发者带来了革命性的变化,成为了不可或缺的工具之一。

Vite的整体架构

关键技术:依赖预打包

Vite通过依赖预打包来优化模块加载性能,主要原因有两点:

  1.  避免过多的文件请求:传统的Webpack等打包工具在开发模式下会生成大量的小文件,增加了网络请求次数,而Vite通过预先将依赖代码打包成更少的文件,减少了网络请求的数量。
  2. 将CommonJS格式转化成ESM格式:浏览器原生支持ES Modules(ESM)格式,而CommonJS在浏览器中的运行效率较低。Vite在预打包过程中将CommonJS代码转换为ESM格式,从而提高了浏览器的执行效率。

实现原理

Vite的预打包机制包括以下步骤:

  1.  在服务启动前,Vite会扫描代码中用到的依赖。
  2. 使用Esbuild工具对这些依赖代码进行预打包,将它们转换为ESM格式,并生成预构建产物。
  3.  Vite会改写import语句,将其指向依赖的预构建产物路径,从而实现快速加载。

单文件编译

Vite使用Esbuild来编译TypeScript(TS)和JSX等文件,这有助于提高编译速度和效率。

局限性
然而,Vite的单文件编译也有一些局限性:

  1. 不支持类型检查:与传统的TypeScript编译器相比,Vite的单文件编译阶段不进行类型检查,类型错误只能在实际运行时被发现。
  2. 不支持将语法降级到ES5:Vite的设计目标是面向现代浏览器,因此不同于一些传统的工具,它不提供将代码降级到ES5的选项。

关键技术:

代码压缩

Vite使用Esbuild作为默认的代码压缩工具,取代了传统的Terser、Uglify.js等工具,从而提高了代码压缩的速度和效果。

插件机制

在开发阶段,Vite使用了插件容器(类似于Mock Rollup)来模拟插件机制,以实现灵活的扩展能力。
在生产环境中,Vite直接使用Rollup作为插件机制的基础,进一步加强了插件的稳定性和可靠性。

Vite的进阶路线

深入双引擎 - Esbuild、Rollup

Vite深入使用了Esbuild和Rollup这两个工具,Esbuild负责快速的开发时编译,Rollup则在生产环境中提供更稳定的插件支持和代码优化。

插件开发

Vite鼓励开发者开发插件以满足不同的需求,插件开发可以分为两个关键方面:

  1.  抽离核心逻辑:将插件的核心功能与Vite的核心逻辑分离,从而实现高度的可扩展性和灵活性。
  2. 使用Hooks进行扩展:Vite提供了不同阶段的Hooks,开发者可以利用这些Hooks来在不同的阶段介入Vite的构建流程,实现自定义功能的添加和修改。

代码分割(拆包)

Vite支持代码分割,但也存在一些问题:

  1. 无法进行并发请求:由于Vite采用了预加载策略,无法像传统的Webpack那样进行并发请求,可能会影响一些场景下的加载速度。
  2. 缓存复用率低:由于快速的模块更新和构建,Vite在不同的构建间隔中,缓存复用率可能较低,这可能对构建性能产生一定影响。

编译工具 - babel

Vite在底层使用babel进行编译,通过语法安全降级,它实现了一种上层解决方案和底层实现的结合:

  1. 上层解决方案(@vitejs/plugin-legacy):基于babel,实现了将代码降级到特定的语法标准,同时注入Poly-fill,如core-js、regenerator-runtime等,以提供更广泛的浏览器兼容性。
  2.  底层实现:Vite利用babel作为工具,实现了自动的语法降级和Poly-fill注入,从而让开发者更专注于业务代码而不是兼容性问题。

服务端渲染(SSR)

Vite在进阶路线中也考虑了服务端渲染(SSR),通过SSR可以提高首屏性能和SEO优化。

深入底层和社区生态

在进阶路线中,Vite鼓励开发者深入了解底层技术,如Esbuild、Rollup等,并积极参与社区生态的建设,以推动Vite的发展和完善。

总结

Vite是一个现代化的前端构建工具,通过关键技术和原理来提高性能和开发体验。其中,依赖预打包和单文件编译是优化模块加载和加快编译速度的关键技术,代码压缩则提高了代码执行效率。插件机制使开发者可以自定义功能和扩展能力,而深入的双引擎和进阶路线则让Vite更加强大和稳定。

除此之外,Vite还支持代码分割、编译工具和服务端渲染等高级特性。通过深入研究Vite的架构和技术原理,开发者可以更好地应用Vite构建现代化的Web应用。