Skip to content

打包工具vite.js

元信息

  • 目标:上手现代项目的默认起点——从 npm create vite 脚手架到 dev server/HMR、CSS 与静态资源、vite.config 配置、环境变量与 Vitest 测试的完整实操
  • 关键概念:脚手架、dev server、HMR、vite.config.js、import.meta.env、Vitest
  • 关联阶段:cp3
  • 常见误区:以为 HMR 就是自动刷新页面(只替换改动模块且保持应用状态);以为 .env 里所有变量客户端都读得到(仅 VITE_ 前缀变量暴露给客户端);以为图片等资源要手工搬运(import 导入后 Vite 开发期直链、生产期自动哈希改名)

vite.js 是什么?

Vite.js是由 Vue.js 的开发者 Evan You 创建的新一代构建工具。它在前端开发人员中很受欢迎,并且可以与 Vue、React 和 Svelte 等框架无缝集成。

它通过以下功能改善了开发体验:

  • 服务器立即启动
  • 通过热模块更换实现快速更新
  • 内置支持 TypeScript、JSX、CSS 和静态资源
  • 使用 esbuild 进行依赖项预打包
  • 由 Rollup 提供支持的生产版本
  • 灵活的插件系统

Vite 还支持 WebAssembly、Web Workers 和 CSS 预处理器等高级功能,而且设置极其简便。无论您使用哪种框架或工具,Vite 的设计都力求快速流畅且操作简单。

先决条件

开始之前,请确保您已安装 Node.js。版本需为 18 或更高(Vite 6 要求 Node 18+,Vite 7 要求 20+),并已安装 npm 。您还应该熟悉 JavaScript 或 TypeScript 以及基本的前端开发概念。

Vite.js 入门

在深入学习之前,让我们创建一个新的 Vite 项目,这样您就可以跟着操作并随时测试所有内容。

运行以下命令即可快速开始:

bash
npm create vite@latest

Vite CLI 会提示您选择项目名称、框架和变体(JavaScript 或 TypeScript)。在本教程中,我们选择“Vanilla”和“JavaScript”,以便在不了解框架特定复杂性的情况下理解 Vite 的核心功能:

bash
    npx create-vite
    

  Project name:
  vite-project

  Select a framework:
  Vanilla

  Select a variant:
  JavaScript

  Scaffolding project in /Users/stanley/vite-project...

  Done. Now run:
    
      cd vite-project
      npm install

安装完成后,导航到您的项目目录并安装依赖项:

bash
cd vite-project
npm install

现在,让我们启动开发服务器:

bash
npm run dev

输出

bash
    > vite-project@0.0.0 dev
    > vite  
  
    VITE v6.3.5  ready in 433 ms
  
  Local:   http://localhost:5173/
  Network: use --host to expose
  press h + enter to show help

在浏览器打开 http://localhost:5173/(Vite 默认端口),可以看到一个基本的 Vite 应用程序:

您首先会注意到的是 Vite 惊人的启动速度——通常只需几毫秒,而传统打包工具则需要几秒甚至几分钟。这得益于 Vite 的创新开发方法,我们将在下文中进一步探讨。

了解 Vite 的开发模式

人们喜爱 Vite 的关键原因之一是其快速流畅的开发体验,这得益于热模块替换 (HMR) 技术。HMR 允许您在保存更改的同时,立即在浏览器中查看更新,而不会丢失应用程序的当前状态。

首先,清空 src 目录下的所有现有文件,以便从头开始。然后,打开 index.html 文件,清除所有内容,并将其替换为以下内容:

index.html

<!DOCTYPE html>
<html>
<head>
  <title>Parcel Sandbox</title>
  <meta charset="UTF-8" />
  <link rel="stylesheet" href="/styles.css" />
</head>
<body>
  <h1>Hello world</h1>
</body>
</html>

如果保存文件,Vite 将找不到 src/main.js ,您会在终端看到类似这样的错误:

输出

bash
    3:56:48 PM [vite] (client) page reload index.html
    3:57:08 PM [vite] Pre-transform error: Failed to load url /src/main.js (resolved id: /src/main.js). Does the file exist?

出现此错误的原因是 src 目录中尚不存在 main.js 。在这种情况下, index.html 文件会尝试从 src 文件夹加载 main.js

现在,在项目的 src 目录下创建一个名为 main.js 新文件,并添加以下代码:

src/main.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

保存文件,然后再次保存 index.html 。你应该会看到更新后的输出:

输出

bash

    3:57:03 PM [vite] (client) page reload index.html 
    3:57:08 PM [vite] Pre-transform error: Failed to load url /src/main.js (resolved id: /src/main.js). Does the file exist?
    3:58:28 PM [vite] (client) page reload index.html

返回浏览器。Vite 应该会自动重新加载页面并更新内容:

现在更新 src/main.js 中的 message.textContent 行,以测试 HMR 的实际效果:

src/main.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

保存文件。Vite 会立即检测到更改并更新 DOM,而无需重新加载整个页面:

您无需刷新浏览器或重启服务器。这就是 Vite 的 HMR 功能强大之处。它只更新应用程序中发生更改的部分,而保持其他所有内容不变——非常适合快速反馈和高效调试。

这种快速、保持状态的工作流程是使用 Vite 进行现代前端开发的最显著优势之一。

在 Vite 中使用 CSS 和资源

与其他打包工具相比,Vite 让样式和资源的管理变得异常简单。让我们一起来探索 Vite 如何以最少的配置来管理这些资源。

CSS 支持

Vite 默认支持 CSS。在 src 目录下创建一个名为 style.css 的新文件:

src/style.css

css
    body {
      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
      background-color: #f5f5f5;
      color: #333;
      max-width: 800px;
      margin: 0 auto;
      padding: 2rem;
    }
    
    h1 {
      color: #646cff;
    }

然后直接将其导入到您的 JavaScript 文件中:

src/main.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

保存 style.cssmain.js 文件后,Vite 会立即应用样式,无需刷新页面。

如您所见,这些样式无需刷新页面即可立即生效。

CSS 预处理器

Vite 支持常用的 CSS 预处理器,且配置极简。我们来看看如何使用 Sass:

首先,安装 Sass 包:

bash
npm add -D sass-embedded

现在在 src 目录下创建一个名为 style.scss 的新文件:

src/style.scss

css
    $primary-color: #646cff;
    $secondary-color: #535bf2;
    
    body {
      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
      background-color: #f5f5f5;
      color: #333;
      max-width: 800px;
      margin: 0 auto;
      padding: 2rem;
    }
    
    h1 {
      color: $primary-color;
    
      &:hover {
        color: $secondary-color;
      }
    }

然后更新你的 JavaScript 文件,改为导入 Sass 文件:

src/main.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

Vite 会自动处理 Sass 文件,并在您保存文件时应用样式。您可以将鼠标悬停在标题上,查看由嵌套规则定义的颜色变化。

其他预处理器,例如 Less 和 Stylus,工作原理类似。只需安装必要的软件包并使用正确的文件扩展名即可。

静态资源

Vite 处理静态资源(例如图片)同样简单。首先,在 src 目录下创建一个名为 assets 的文件夹:

bash
    mkdir -p src/assets

之后,下载 Vite 标志:

bash
    curl -o src/assets/vite-logo.png https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Vitejs-logo.svg/820px-Vitejs-logo.svg.png

现在更新你的 HTML 代码,将图片添加到代码中:

index.html

<!DOCTYPE html>
<html>
<head>
  <title>Parcel Sandbox</title>
  <meta charset="UTF-8" />
  <link rel="stylesheet" href="/styles.css" />
</head>
<body>
  <h1>Hello world</h1>
</body>
</html>

保存文件后,您应该会在页面上看到 Vite 的标志。

您也可以直接在 JavaScript 中管理图像。请更新您的 main.js 文件:

src/main.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

保存并返回浏览器后,您将在页面上看到两个徽标——一个通过 HTML 加载,另一个通过 JavaScript 添加:

当您在 JavaScript 中导入图片时,Vite 会对其进行处理,并将导入语句替换为指向最终资源的 URL。在开发环境中,此 URL 直接指向资源。在生产环境中,Vite 会优化图片,使用内容哈希值重命名图片以清除缓存,并自动更新所有引用。

这种方法不仅适用于图像,也适用于字体、视频、音频和其他静态文件。只需在代码中导入它们,Vite 就会处理剩下的事情。

使用 vite.config.js 自定义 Vite

Vite 开箱即用,效果出色,但随着项目的发展,您可能需要自定义其行为。Vite 的配置文件让这一切变得轻松简单。

在项目根目录下创建 vite.config.js 文件:

vite.config.js

javascript
    export default {
      // configuration options go here
    }

更改开发服务器端口

我们先从一个简单的改动开始——更新服务器端口。将以下内容添加到您的配置文件中:

vite.config.js

javascript
    export default {
    server: {
    port: 3000,    // Change from default 5173
    open: true     // Auto-open browser
    }
    }

现在重启开发服务器:

bash
    npm run dev

你的终端应该会显示不同的输出:

输出

bash

      VITE v6.3.5  ready in 180 ms
    
  Local:   http://localhost:3000/
  Network: use --host to expose
  press h + enter to show help

请注意,服务器现在运行在 3000 端口而不是 5173 端口上,您的浏览器应该会自动打开到新地址。

使用 defineConfig 实现更智能的配置

为了进行更高级的自定义,请更新您的 vite.config.js 文件以使用 Vite 的 defineConfig 助手:

vite.config.js

javascript
    import { defineConfig } from 'vite'
    
    export default defineConfig({
      server: {
        port: 3000,
        open: true
      }
    })

在这段代码中,你从 Vite 导入 defineConfig 助手,并使用它来包装你的配置对象。

这不会改变配置的行为方式,但可以为您提供更好的编辑器支持,例如自动完成和内联文档。

此外,如果您想根据环境或其他自定义逻辑添加条件,它也可以让您的配置更容易扩展。

使用环境变量

Vite 可以使用环境变量轻松定义在开发和生产环境之间变化的值。

这些变量通常存储在 .env 文件中,并根据当前模式( developmentproduction )自动加载。

在项目根目录下创建一个 .env 文件,并添加一些示例值:

.env

ini
    VITE_API_URL=https://dev.example.com/api
    VITE_APP_NAME=My Vite App

注意:只有以 VITE_ 为前缀的变量才会暴露给客户端代码。这有助于避免意外泄露敏感信息。

您可以使用 import.meta.env 在应用程序代码中访问这些变量:

src/main.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

这些日志会在页面加载时将您的 .env 值打印到浏览器控制台:

这提供了一种简洁可靠的方法来管理特定环境的值。

使用 Vitest 设置测试

Vite 与 Vitest 完美搭配——Vitest 是一款快速测试运行器,其设计风格类似 Jest,但专为 Vite 生态打造。您可以编写单元测试,通过用户界面运行测试,并获得即时反馈——所有操作都与您现有的 Vite 项目集成。

首先安装 Vitest 及其用户界面:

bash
    npm install -D vitest @vitest/ui

如果您计划测试 DOM 代码,也请安装 jsdom

bash
    npm install -D jsdom

接下来,更新现有的 vite.config.js 文件,添加一个 test 部分。以下是如何在不删除现有配置的情况下添加测试部分的方法:

vite.config.js

javascript
    import { defineConfig } from 'vite'
    
    export default defineConfig({
      server: {
        port: 3000,
        open: true
      },
    test: {
    globals: true,
    environment: 'jsdom',
    ui: true
    }
    });

这样可以保持您的开发服务器配置完整,并支持 Vitest,启用测试全局变量(如 describeitexpect ),并使用 jsdom 设置类似浏览器的环境。

现在,创建一个名为 src/main.test.js 的新文件,并添加一个简单的测试:

src/main.test.js

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

您可以使用以下命令运行测试:

bash
    npx vitest

你应该会在终端看到类似这样的输出:

输出

bash
     DEV  v3.1.3 /Users/stanley/vite-project
          UI started at http://localhost:51204/__vitest__/
    
 src/main.test.js (1 test) 1ms
 sample test > adds numbers correctly 1ms
    
     Test Files  1 passed (1)
          Tests  1 passed (1)
       Start at  17:05:24
       Duration  655ms (transform 16ms, setup 0ms, collect 11ms, tests 1ms, environment 405ms, prepare 45ms)
    
     PASS  Waiting for file changes...
           press h to show help, press q to quit

如您所见,Vitest 测试运行速度很快,并持续监控变化。它提供详细的输出,准确显示哪些测试通过以及每个步骤耗时多久。

您还可以使用内置的浏览器用户界面以交互模式运行 Vitest:

bash
    npx vitest --ui

这将启动一个视觉测试运行程序,运行程序位于本地地址,您可以在其中执行以下操作:

  • 查看实时测试结果

  • 立即重新运行测试

  • 查看错误和堆栈跟踪

  • 使用现代化的界面浏览测试文件

该界面在积极开发过程中尤其有用,可在编写或更新测试时提供即时反馈。

小结

Vite 为您提供了一种快速、现代的方式来构建 Web 应用程序。

它开箱即用,支持 ES 模块、TypeScript、CSS 预处理器和静态资源,无需额外设置。

将它与 Vitest 结合使用,可以得到一个简单而强大的测试设置,可以轻松融入您的项目中。

了解更多信息,请查看: