Skip to content

Vitest 3.0 新機能

Vitest 3.0 新機能というテーマはコミュニティで何度も議論されてきましたが、バージョンのアップデートとともに多くの結論が更新を必要としています。本記事では最新バージョンをベースに改めて整理します。

入門ガイド

重要なのは、コアロジックを理解することです:

javascript
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { LoginForm } from "./LoginForm";

describe("LoginForm", () => {
  it("提交有效的登录表单", async () => {
    const onSubmit = jest.fn();
    render(<LoginForm onSubmit={onSubmit} />);
    await userEvent.type(screen.getByLabelText(/邮箱/), "user@example.com");
    await userEvent.type(screen.getByLabelText(/密码/), "password123");
    await userEvent.click(screen.getByRole("button", { name: /登录/ }));
    await waitFor(() => {
      expect(onSubmit).toHaveBeenCalledWith({
        email: "user@example.com",
        password: "password123",
      });
    });
  });
});

パフォーマンス最適化は具体的なシナリオに合わせる必要があります。すべての場面で過度な最適化が必要なわけではありません。

ソースコード解析

次の方法で改善できます:

javascript
module.exports = {
  entry: "./src/index.js",
  output: { path: __dirname + "/dist", filename: "[name].[contenthash:8].js" },
  module: {
    rules: [
      { test: /\.jsx?$/, exclude: /node_modules/, use: "babel-loader" },
      { test: /\.css$/, use: ["style-loader", "css-loader", "postcss-loader"] },
    ],
  },
  optimization: {
    splitChunks: {
      chunks: "all",
      cacheGroups: {
        vendor: { test: /[\\/]node_modules[\\/]/, name: "vendors" },
      },
    },
  },
};

このソリューションは半年以上本番環境で安定稼働しており、実証済みです。

実際のシナリオへの応用

まずは基本的な実装方法を見てみましょう:

javascript
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";

export default defineConfig({
  plugins: [vue()],
  resolve: { alias: { "@": resolve(__dirname, "src") } },
  server: {
    port: 3000,
    proxy: { "/api": { target: "http://localhost:8080", changeOrigin: true } },
  },
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ["vue", "vue-router", "pinia"],
          utils: ["lodash-es", "dayjs"],
        },
      },
    },
  },
});

このコードは基本的な使い方を示しています。実際のプロジェクトでは、エラーハンドリングやエッジケースも考慮する必要があります。

最適化テクニック

この基礎の上で、さらに最適化できます:

javascript
import { test, expect } from "@playwright/test";

test.describe("用户登录流程", () => {
  test("成功登录跳转到首页", async ({ page }) => {
    await page.goto("/login");
    await page.fill('[data-testid="email"]', "admin@example.com");
    await page.fill('[data-testid="password"]', "admin123");
    await page.click('[data-testid="submit-btn"]');
    await expect(page).toHaveURL("/dashboard");
    await expect(page.locator(".welcome")).toContainText("欢迎回来");
  });
});

このパターンは大規模プロジェクトで非常に実用的で、メンテナンスコストを大幅に削減できます。

まとめ

  • 根本的な原理を理解することが API を覚えるより重要
  • 本番環境で使用する前に、必ず互換性の検証を行う
  • チームでの協業において、規約とドキュメントは技術そのものより重要
  • コミュニティの動向に注目し、技術的なアプローチは継続的に反復が必要

MIT Licensed