Vite | 青训营

236 阅读5分钟

Vite概要介绍

Vite是什么? Why Vite?

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

  • 两大组成部分

    • No-bundle开发服务,源文件无需打包
    • 生产环境基于Rollup的Bundler
  • 核心特征

    • 高性能,dev启动速度和热更新速度非常快。
    • 简单易用,开发者体验好

当下问题(开发体验问题日渐显露)

  1. 缓慢的启动,这意味着项目编译等待成本高。
  2. 缓慢的热更新,以至于修改代码后不能快速同步更新。

对于产生上述两点问题的原因就是bundle带来的大量性能开销以及JavaScript语言的性能瓶颈。

瓶颈在哪里?

  • bundle带来的性能开销
  • JavaScript语言的性能瓶颈

行业趋势

基于原生ESM的开发服务优势

  • 无需打包项目源代码
  • 天然的按需加载
  • 可以利用文件级的浏览器缓存

全球浏览器对原生ESM普遍支持

当前浏览器绝大部分都能运行以下代码(script标签增加type=’module’属性;支持ESM模块导入导出语法):

// fn.js
export const fn = 'fn'
// index.html
<!DOCTYPE html>
<html lang="en" >
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.jpg">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>demo</title>
  </head>
  <body>

    <script type="module" >
        import {fn} from './fn.js'
        console.log(fn) // fn
    </script>
  </body>
</html>

基于Esbuild的编译性能优化

基于原生语言(如golang,Rust)编写的前端工具链逐渐兴起(如golang编写的Esbuild,Rust编写的SWC等)

image.png

Esbuild——基于Golang开发的前端工具,具备如下能力:

  • 打包器Bundler
  • 编译器Transformer
  • 压缩器Minifier
  • 性能极高,在Vite中被深度使用

整体架构

Vite架构图

image.png

预打包

原因:

  • 避免过多的node_modules
  • 将commonjs 转换成ESM

原理:

  • 服务启动前扫描依赖包
  • 用esbuild预打包
  • 将import 路径改为预构建产物的路径
//改写前
import React from "react";
//改写后
import React from '/node_modules/.vite/react.js'

单文件编译

优势:

使用Esbuild编译TS/JSX,速度非常快 提升至10-100X

局限性:

  • 不支持类型检查,因此在生产环境构建时要调用一次tsc。(在生产构建项目时要先通过类型编译检查才行,如下图)
  • 不支持语法降级到ES5,只能降到ES6。比如说箭头函数在低版本浏览器是会报错的。

image.png

插件机制

使用插件的原因:

  • 解耦:将两大功能 构建 和 dev server 分开
  • 易于扩展

过程:

  • 开发阶段:用插件模拟rollup
  • 生产阶段:直接使用rollup

重要插件

image.png

vite进阶学习

深入学习构建工具

编译原理: 解析为抽象语法树,转化后,再生成代码

image.png

服务端渲染(SSR)

是一种将动态生成的页面在服务器端进行渲染并将最终渲染结果发送到客户端的技术。相比于传统的客户端渲染(CSR,Client-Side Rendering),SSR 提供了一些优势和用途。

优势:

  1. 搜索引擎优化(SEO):由于搜索引擎爬虫通常只能读取和索引静态 HTML 内容,SSR 可以在服务器端将动态生成的页面渲染为完整的 HTML,并直接提供给搜索引擎进行索引。这使得搜索引擎更容易理解和索引您的网站内容,从而提高 SEO 的效果。
  2. 更快的首次加载时间:在 CSR 中,浏览器首先下载 HTML 文件,然后再通过执行 JavaScript 代码来生成和渲染页面内容。而在 SSR 中,服务器已经将页面渲染为完整的 HTML,并直接发送给客户端,因此用户可以更快地看到初始渲染的页面内容,提供更好的用户体验。
  3. 更好的性能表现:尽管 SSR 的初始加载时间可能会比 CSR 稍长,但一旦初始页面加载完成,后续的页面切换和导航通常会更快,因为服务器已经提供了渲染好的 HTML,不再需要执行大量的客户端 JavaScript 代码。
  4. 支持社交媒体分享和链接预览:由于 SSR 提供了完整的 HTML 页面,社交媒体网站(如 Facebook、Twitter)可以直接抓取页面内容,生成预览卡片,方便分享和链接展示。
  5. 更好的可访问性和可持续性:SSR 使得您的网站在不支持 JavaScript 或 JavaScript 被禁用的环境中仍然可访问,并提供更好的可持续性。

需要注意的是,SSR 也有一些考虑因素和挑战,包括服务器负载的增加、对后端代码的要求、缓存管理等。此外,SSR 适用于那些需要搜索引擎优化首次加载性能更好用户体验的场景,对于一些复杂的交互和动态内容,CSR 仍然是一个合适的选择。

综上所述,SSR 提供了许多好处,包括更好的 SEO更快的初始加载时间更好的性能表现以及更好的可访问性可持续性。但在选择使用 SSR 时,需要根据具体场景和需求进行权衡和决策。

Vite和Webpack

两种打包工具区别是什么:

  • webpack服务器启动速度比vite慢。
  • Vite热更新比webpack快。
  • Vite生态不及webpack,加载器、插件不够丰富。
  • Vite打包到生产环境时,Vite使用传统的rollup进行打包,生产环境esbuild构建对于css和代码分割不够友好。所以,vite的优势是体现在开发阶段。
  • Vite项目的开发浏览器要支持esmodule,而且不能识别commonjs语法。