1.1 浅谈架构工具
为什么需要架构工具?
因为架构工具解决了前端开发具有以下的痛点:
- 不同的模块化标准 架构工具提供的解决方案:提供模块加载方案,兼容不同的模块规范。
- 如何进行资源编译 架构工具提供的解决方案:高级语法转换(less转CSS,ts转js);资源加载,如图片、字体等
- 产品质量(比如代码体积,代码性能,兼容性) 架构工具提供的解决方案:产物压缩,无用代码删除,语法降级。
- 开发效率 架构工具提供的解决方案:热更新。
1.2 Vite 概要介绍
什么是vite?为什么用vite?
第一问答:
- 定位:vite是新一代前端构建工具。
- 两大组成部分:No-bundle开发服务,源文件无需打包以及生产环境基于Rollup的Bundler
- 核心特征:高性能,dev服务器启动速度和热更新速度非常快!以及简单易用,开发者使用体验好。
第二问答:
(1)当下架构工具普遍具有以下的问题:dev服务器启动速度慢(项目编译等待成本高),并且热更新速度慢(修改代码后不能实时更新)。而vite解决了这个问题。
(2)目前浏览器普遍对于原生ESM提供支持。Vite使用了ESM标准,最大限度地发挥了其优势。
ESM是ECMAScript Modules的缩写,是JavaScript的一种模块化标准,它允许我们在JavaScript文件中使用import和export语句来导入和导出变量、函数、类等。ESM可以让我们更好地组织和管理代码,避免命名冲突和全局污染,实现代码的复用和解耦。 要使用ESM,我们需要在script标签中添加type="module"属性,这样浏览器就会将该脚本视为一个ESM模块,并按照ESM的规则进行解析和执行。例如:
<script type="module">
import { hi } from './hi.js'
console.log(hi)
</script>
基于ESM,我们就会有以下优势:
- 无需打包项目源代码。
- 天然的按需加载。
- 可以利用文件级的浏览器缓存。
(3)Esbuild —— 基于Golang开发的前端工具,具备如下能力:
- 打包器 Bundler
- 编译器 Transformer
- 压缩器 Minifier
性能极高,在Vite中被深度使用
(4)Vite开箱即用的功能等价于

1.3 Vite 上手实战
如何使用Vite?
要使用vite,我们首先需要安装Node.js和npm,这是前端开发的基本环境。
- 提前安装 pnpm
pnpm 是一种可替代 npm 的包管理工具。与 npm 类似,pnpm 也用于下载、安装和管理 JavaScript 包和模块。但是,它在一些方面与 npm 不同,并提供了一些额外的优势。
下面是一些 pnpm 相对于 npm 的区别和优势:
快速安装和更新:pnpm 使用一种称为“链接包”的机制,它只会在磁盘上保存一个包的副本,并在各个项目之间共享。这意味着当你在多个项目中使用相同的包时,只需下载一次,而不是针对每个项目都下载一份。这种机制可以加快安装和更新的速度。
更少的磁盘空间占用:由于 pnpm 的链接包机制,它可以减少磁盘上的重复包,从而减少磁盘空间的占用。这对于使用多个项目或大型项目的开发者来说尤其有用。
并行安装:pnpm 能够并行安装多个包,这意味着它在安装依赖时能够更快地完成。
易于迁移:如果你已经使用 npm,你可以很容易地迁移到 pnpm。它兼容 package.json 和 npm 的命令,无需对现有代码进行修改。
尽管 pnpm 提供了这些优势,但是否有必要使用它取决于你的具体情况和需求。如果你使用多个项目或大型项目,并且对安装时间和磁盘空间占用有着高效率的要求,那么 pnpm 可能会对你有所帮助。但如果你的项目规模较小,或者没有特别关注这些问题,继续使用 npm 也是可以的。
最后,无论你选择使用 npm 还是 pnpm,重要的是要了解和熟悉所使用的工具,并在项目中正确配置和优化依赖项管理。
npm i -g pnpm
2. 初始化命令
pnpm create vite
-
执行完这步之后,会让你填写vite包的名称,这里默认是vite-project,不改就直接回车即可
-
然后显示一些常见的框架vue、react等等,上下键选择,回车确认。例如这里选择react(后面都以选择react为例子)
-
然后选择开发方式,上下键选择,回车确认。 这时项目目录内就会生成一个叫vite-project的文件夹
- 进入文件夹
cd vite-project
4. 安装依赖
pnpm install
5. 启动项目
npm run dev

默认开启Tree shaking
Tree shaking 是一种用于优化 JavaScript 模块打包大小的技术。它的目标是删除应用程序中没有使用的代码,以减少打包后的文件体积。
Tree shaking 的原理是通过静态代码分析来确定哪些代码被应用程序使用,然后将未使用的代码标记为可删除。这样,在打包过程中,这些未使用的代码将被移除,从而减少了最终生成的包的大小。
1.4 Vite整体架构
-
依赖预打包 依赖预打包是vite的一个重要特性,它可以提高开发服务器的启动速度和热更新速度。依赖预打包的原理是,在第一次启动开发服务器时,vite会扫描项目中的所有依赖模块(即node_modules中的模块),并使用esbuild将它们转换为ESM格式,并缓存到一个临时目录中。这样,当开发服务器需要加载某个依赖模块时,就可以直接从缓存中读取,而无需再次转换。这样可以避免每次启动或更新时都要对所有的依赖模块进行转换,从而节省了时间和资源。
-
vite单文件编译(esbuild) vite单文件编译是指vite在开发服务器中对项目源代码(即src目录下的文件)进行的即时编译。vite使用esbuild作为编译器,可以快速地将高级语法(如TypeScript、JSX、CSS预处理器等)转换为浏览器可执行的代码,并支持Source Map、HMR等特性。vite单文件编译的原理是,当浏览器请求某个源文件时,vite会拦截该请求,并根据文件类型和后缀名来调用相应的esbuild插件来进行编译,并将编译后的结果返回给浏览器。这样,浏览器就可以直接执行该文件,而无需等待整个项目打包完成。
优势:编译速度提升了10-100x 劣势:不支持类型检查;不支持语法降级到ES5
-
代码压缩 代码压缩是指在生产环境中对项目代码进行优化和精简的过程,目的是减少代码体积,提高代码性能,节省网络带宽。 Esbuild作为默认压缩工具,替换传统的Terser、Uglify.js等压缩工具
-
插件机制 插件机制是指vite允许开发者通过安装或编写插件来扩展vite的功能或定制化vite的行为。插件本质上是一个JavaScript对象,它可以定义一些钩子函数(Hook Functions),来在vite的不同阶段执行一些操作或逻辑。在Vite中
- 开发阶段->模拟Rollup插件机制
- 生产环境-> 直接使用Rollup
1.5 Vite进阶路线
1.5.1 深入双引擎
esbuild的官方文档:[esbuild.github.io/] esbuild的入门教程:[www.youtube.com/watch?v=6mt…] rollup的官方文档:[rollupjs.org/guide/en/] rollup的入门教程:[www.youtube.com/watch?v=zye…]
推荐学习顺序:
- 先了解基本使用,手动尝试各项配置
- 然后学习插件开发
1.5.2 Vite 插件开发
- 为什么要插件开发?
- 抽离核心逻辑,易于扩展
- Vite 插件开发的步骤:
- 创建一个JavaScript文件,导出一个函数或对象作为插件。
- 在函数或对象中定义一些钩子函数(Hook Functions),来在vite的不同阶段执行一些操作或逻辑。
- 在vite.config.js中导入并使用该插件。
- 在package.json中添加该插件的相关信息,如名称、版本、描述等。
- 发布该插件到npm或其他平台,或者在本地使用该插件。
- 参考资料
1.5.3 代码分割(拆包)
代码分割(Code Splitting)是指将一个大的代码文件拆分为多个小的代码文件的过程,目的是实现按需加载,提高应用的性能和用户体验。
1.5.4 JS编译工具(babel)
JS编译工具(Babel)是一个JavaScript的转换器,它可以将高级语法(如ES6+、JSX等)转换为低级语法(如ES5等),以实现浏览器或其他环境的兼容性。Babel的工作原理是:
解析:将源代码转换为AST(抽象语法树),并进行词法分析和语法分析。 转换:根据配置或插件来对AST进行修改或替换,实现语法转换或优化。 生成:将转换后的AST重新生成为目标代码,并添加一些辅助代码或注释。
补充: babel和Vite关系不大,但是是一个前端工程化必须要学习的东西
参考资料如下:
1.5.5 语法安全降级
语法安全降级是指在使用高级语法时,考虑到低版本浏览器或其他环境的兼容性问题,而采用一些低级语法或替代方案来实现相同或类似的功能或效果。
参考资料:
1.5.6 服务器渲染SSR
服务器渲染SSR(Server-Side Rendering)是指在服务器端对页面进行渲染,并将渲染后的HTML字符串发送给浏览器的过程,目的是提高首屏渲染速度,提升SEO效果,改善用户体验。
参考资料:
1.5.7.了解底层标准:CJS规范,ESM规范,HTTP2.0特性等等
参考资料:
1.5.8 vite社区生态:官方提供的部分插件
vite社区生态是指vite周围形成的一系列的资源、工具、插件、框架、教程、案例等,它们可以帮助开发者更好地使用和学习vite,也可以让开发者参与到vite的贡献和改进中。 github上这个还在维护