Vite总结

76 阅读2分钟

一、概要

1.vite概览

(1)定位:新一代前端构建工具

(2)两大组成部分

  1. No-bundle开发服务(NodeJs的devserver),源文件无需打包(与传统工具最大的不同)
  2. 生产环境基于Rollup的Bundler,将所有代码进行打包

(3)核心特征

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

2.对比

(1)Rollup -> Vite

  • 启动时间:2分15秒->1.7秒
  • 更新时间:23秒->1秒以内

(2)Webpack -> Vite

  • 启动时间:2分36秒->6秒
  • 热更新:13秒->1秒以内

3.当下问题

(1)开发体验问题
缓慢的启动->项目编译等待成本高
缓慢的热更新->修改代码后不能实时更新

(2)瓶颈
bundle打包带来的性能开销
JavaScript语言的性能瓶颈

4.两大行业趋势

(1)全球浏览器对原生ESM的普遍支持(目前占比92%以上)

(2)基于原生语言(Go、Rust)编写前端编译工具链 如Go语言编写的Esbuild、Rust 编写的SWC

5.浏览器原生ESM支持

(1)两大要素

  • script标签增加type="module”属性
  • ESM模块导入导出语法

代码样例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test esm</title>
    </head>
    <body>
        <script type="module">
            import { foo } from './foo.js'
            console.log(foo);
        </script>
    </body>
    </html>

export const foo = "foo";

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

(1)无需打包项目源代码

(2)天然的按需加载

(3)可以利用文件级的浏览器缓存

7.### 基于Esbuild的编译性能优化

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

  1. 打包器Bundler:对应webpack的工作
  2. 编译器Transformer
  3. 压缩器Minifier

(2)性能极高,在Vite 中被深度使用

8.内置的web构建能力

(1)Vite开箱即用的功能等价于webpack、webpack-dev-server、css-loader、style-loader、less-loader、sass-loader、postcss-loader、file-loader、MiniCssExtractPlugin、HTMLWebpackPlugin

(2)可以看出:vite是对常见web开发的需求进行一个封装

二、使用Vite

1.项目初始化

安装pnpm

#提前安装 pnpm
npm i -g pnpm
#初始化命令
pnpm create vite
#安装依赖
pnpm install
#启动项目
pnpm run dev

2.使用Sass/Scss & CSS Modules

安装sass

pnpm install sass -D

编写index.tsx文件

import React from "react"; 
    export function Header(){
        return <div>Header</div>
    }

在App.tsx文件引入,使用

import { Header } from './components/Header'
// 在App()中使用
<Header></Header>

叠加sass、css-module,编写样式

.header {
  color: red;
}

在index.tsx中引入、使用

import React from "react";
import styles from "./index.module.scss";
export function Header() {
  return <div className={styles.header}>Header</div>;
}

3.使用静态资源

静态资源在vite可以直接引入使用

4.HMR

可以保存组件的局部状态,当改变index下的内容时,App下的count值会保留

5.生产环境Tree Shaking

优化原理:

1.基于ESM的import/export语句依赖关系与运行时的状态无关

2.在构建阶段将无用代码删除

3.Tree Shaking在vite中无需配置,自动开启