前端构建工具Vite概要 | 字节青训营笔记

200 阅读4分钟

1.为什么需要构建工具?

1.前端工程的痛点

前端项目的核心要素----资源:JSTS,JSX,css,scssLESSPNGJPEG,WEBP。前端功能化的的问题越来越明显。

  1. 模块化:把项目拆分不同的模块,分别进行拆分和维护,分而治之。比较流行的模块化ESM、CommonJs、UMD
  2. 资源编译:高级语法的编译,在编译的过程中涉及一系列的工具链,因此对于编译工具链的集成也成为了刚需。(简而言之:浏览器的标准赶不上前端开发者的脑洞)
  3. 产物质量:代码体积、代码性能。对于未使用的代码需要将他们剔除掉,优化产物体积。
  4. 开发效率:热更新。

2.构建工具的意义

解决前端功能化的问题。 image.png

2.Vite概览

Vite定位:新一代前端构建工具

1. 两大组成部分

  1. 无捆绑开发服务,源文件无需打包
  2. 生产环境基于 Rollup 的 Bundler

核心特征

  1. 高性能,dev 启动速度和热更新速度非常快!
  2. 简单易用,开发者体验好
  3. vite底层基于原生ESM的开发:优势,无需打包项目源代码, 天然的按需加载, 可以利用文件级的浏览器缓存。

3. vite内置的web构建能力

  1. Vite 开箱即用的功能等价于webpack,webpack-dev-servercss-loader,style-loader,

less-loader,sass-loader,postcss-loader,file-loader, MiniCssExtractPluginHTMLWebpackPlugin....

4.Vite的基本使用

  1. 初始化Vite
npm create vite

2.可以看到如下界面

image.png

  1. 文件讲解

image.png 4. 使用Sass/Scss&CSS Module

npm install sass

5. 生产环境Tree Shaking

优化原理

  1. 基于 ESM 的 import/export 语句依赖关系,与运行时状态无关
  2. 在构建阶段将未使用到的代码进行删除

5,Vite的整体架构

image.png

1.依赖预打包

  • 为什么要进行预打包?
  1. 避免 node modules 过多的文件请求
  2. 将 CommonJS 格式转换为 ESM 格式
  • 实现原理:
  1. 服务启动前扫描代码中用到的依赖
  2. 用 Esbuild 对依赖代码进行预打包
  3. 改写 import 语句,指定依赖为预构建产物路径
  • 预打包实现过程:

在vite的devserve启动前,扫描代码用的依赖,对依赖的代码采用esbuild进行打包,打包完之后,把业务代码中的import语句进行改写。

2. 单文件编译:用Esbuild编译TS/JSX

  1. 优势: 编译速度提升 10-100倍
  2. 局限性:
  • 不支持类型检查
  • 不支持语法降级到 ES5

3. 代码压缩

  1. Esbuild 作为默认压缩工具,替换传统的 Terser、Uglifyjs 等压缩工具
  2. 性能对比如下:

image.png

4. 插件机制

开发阶段模拟 Rollup 插件机制IV 生产环境直接使用 Rollup

6.Vite学习路线

1.深入双引擎

  1. esbuild 和rollup.js

参考资料:

  1. 推荐学习顺序
  • 先了解基本使用,动手尝试各项常用配置
  • 然后学习其插件开发。

2. Vite拆件开发

  1. 为什么需要插件机制?
  • 抽离核心逻辑
  • 易于拓展
  • vite 插件的钩子 hooks:你可以在对于的钩子处调用它实现不同的功能
  1. 插件开发流程

image.png 3. 代码拆包

  • vite 之前的打包一般代码都在一个文件里,无法进行并发求请,缓存利用率低,修改任何文件,都需要重新打包。
  • 拆包就是就是把核心代码分成多个包,如果一个包修改了,其他包不受影响,学习 rollup 的代码分割,vite 就是基于 rollup 的代码分割的

3. js编译工具Babel

  1. js 的语法标准繁多,但是浏览器支持不一致,但是开始想要使用高级的语法,babel 就是把高级代码进行降低的工具。 原理可以查看官网文档

  2. babel 也可以配置插件,你也可以自己编写其插件,你可以查看这个手册来学习。 参考资料

  3. 语法安全降级

如何在构建产物中避免这类问题?

  1. 上层解决方案: @viteis/plugin-legacy
  2. 底层原理
    • 借助 Babel 进行语法自动降级
    • 提前注入 Polyfill 实现,如 core-is、regenerator-runtime

4. SSR

  • 这是一种常见的渲染模式,用于优化提升首屏幕的性能。vite提供了 vite-ssr 项目打包渲染的方案 ,可以查看官方文档

image.png