阿里云主机折上折
  • 微信号
Current Site:Index > The Vite build tool translates this sentence into English.

The Vite build tool translates this sentence into English.

Author:Chuan Chen 阅读数:42542人阅读 分类: Vue.js

Vite is a lightning-fast build tool for modern browsers, developed by Evan You, the creator of Vue.js. It leverages native ES module support in browsers and the ultra-fast compilation capabilities of esbuild to achieve near-instant hot updates in development, while using Rollup for production builds. Compared to traditional build tools, Vite offers significant improvements in development experience and build speed.

Core Advantages of Vite

Vite's core advantage lies in its innovative development server design. Traditional build tools like webpack require bundling the entire application on startup, whereas Vite directly utilizes the browser's native support for ES Modules:

// Traditional approach - requires bundling to run
import { createApp } from 'vue'
import App from './App.vue'

// Vite approach - browser directly loads ESM
import { createApp } from '/node_modules/.vite/vue.js'
import App from '/src/App.vue?t=1629780000000'

This design brings three key advantages:

  1. Cold start time is independent of project size
  2. On-demand compilation, only compiling files used on the current screen
  3. Native ESM hot module replacement (HMR) is extremely fast

Project Initialization and Configuration

Creating a Vite project is straightforward:

npm create vite@latest my-vue-app --template vue

The project structure follows the convention-over-configuration principle:

my-vue-app/
├── node_modules/
├── public/
├── src/
│   ├── assets/
│   ├── components/
│   ├── App.vue
│   └── main.js
├── vite.config.js
└── package.json

Basic configuration file example:

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  server: {
    port: 3000,
    open: true
  },
  build: {
    outDir: 'dist',
    assetsInlineLimit: 4096
  }
})

Development Server Features

Vite's development server offers several enhanced capabilities:

Fast Hot Module Replacement

When modifying Vue single-file components, Vite can precisely update changed modules without refreshing the page:

<!-- src/components/HelloWorld.vue -->
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

<template>
  <button @click="count++">Count is: {{ count }}</button>
</template>

When changing the initial value of count or the template content, the component state is preserved.

Dependency Pre-Bundling

On first startup, Vite uses esbuild to pre-bundle dependencies:

[vite] Optimizable dependencies detected:
vue, vue-router, pinia...
[vite] Pre-bundling them to speed up dev server page load...

This provides two benefits:

  1. Converts CommonJS/UMD dependencies to ESM
  2. Combines multiple file requests (e.g., submodules of lodash)

Production Build

Production builds use Rollup and automatically enable multiple optimizations:

// Build command
vite build

// Advanced configuration example
build: {
  rollupOptions: {
    output: {
      manualChunks(id) {
        if (id.includes('node_modules')) {
          return 'vendor'
        }
      }
    }
  }
}

Typical optimizations include:

  • Code splitting
  • Asset compression
  • CSS extraction
  • Async chunk loading

Plugin System

Vite plugins extend the Rollup plugin interface and add Vite-specific hooks. Common plugin examples:

// Custom plugin example
export default function myPlugin() {
  return {
    name: 'transform-file',
    transform(code, id) {
      if (id.endsWith('.custom')) {
        return { code: code.replace(/foo/g, 'bar') }
      }
    }
  }
}

Officially maintained core plugins:

  • @vitejs/plugin-vue: Vue single-file component support
  • @vitejs/plugin-vue-jsx: Vue JSX support
  • @vitejs/plugin-legacy: Legacy browser support

Deep Integration with Vue

Vite provides out-of-the-box support for Vue:

Single-File Component Enhancements

Supports all Vue SFC features:

<script setup>
// Composition API syntax sugar
import { useCounter } from './counter.js'
const { count, increment } = useCounter()
</script>

<template>
  <button @click="increment">{{ count }}</button>
</template>

<style scoped>
button {
  color: var(--primary);
}
</style>

Custom Block Handling

Supports custom SFC blocks and processing via plugins:

<docs>
## Component Documentation
This is a counter component
</docs>

Corresponding plugin configuration:

plugins: [
  vue({
    customBlocks: ['docs']
  })
]

Advanced Features

Environment Variable Handling

Vite uses dotenv to load .env files:

.env
VITE_API_URL=https://api.example.com

Client-side usage:

console.log(import.meta.env.VITE_API_URL)

CSS Processing

Supports CSS Modules, preprocessors, and PostCSS:

<style module>
.red { color: red }
</style>

<style lang="scss">
$primary: #1890ff;
.button {
  background: $primary;
}
</style>

Static Asset Handling

Special import syntax for various assets:

import imgUrl from './image.png?url'       // Resolves to URL
import imgRaw from './image.png?raw'      // Imports as string
import worker from './worker.js?worker'  // Imports as Web Worker

Performance Optimization Practices

Dependency Optimization

Manually specify dependencies to pre-bundle:

optimizeDeps: {
  include: ['vue', 'vue-router', 'lodash-es'],
  exclude: ['vue-demi']
}

Chunking Strategy

Configure code splitting via rollupOptions:

build: {
  rollupOptions: {
    output: {
      manualChunks: {
        'vue-vendor': ['vue', 'vue-router', 'pinia'],
        'utils': ['lodash-es', 'axios']
      }
    }
  }
}

Async Loading

Implement route-level code splitting with dynamic imports:

const UserDetails = () => import('./views/UserDetails.vue')

Integration with Other Tools

Working with Vue Router

Typical router configuration example:

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue')
  }
]

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
})

State Management (Pinia)

Create and use stores:

// stores/counter.js
import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  actions: {
    increment() {
      this.count++
    }
  }
})

Usage in components:

<script setup>
import { useCounterStore } from '@/stores/counter'
const counter = useCounterStore()
</script>

<template>
  <button @click="counter.increment">
    {{ counter.count }}
  </button>
</template>

Debugging and Troubleshooting

Vite provides detailed debugging information:

# Enable debug logging
DEBUG=vite:* vite

Common issue resolution:

  1. Dependency resolution issues:
resolve: {
  alias: {
    '@': path.resolve(__dirname, './src')
  }
}
  1. Browser compatibility issues:
import legacy from '@vitejs/plugin-legacy'

plugins: [
  legacy({
    targets: ['defaults', 'not IE 11']
  })
]

Custom Development Server

Extend Vite development server functionality:

server: {
  proxy: {
    '/api': {
      target: 'http://localhost:3000',
      changeOrigin: true,
      rewrite: path => path.replace(/^\/api/, '')
    }
  },
  middlewareMode: 'html'
}

Create custom middleware:

import { createServer } from 'vite'

const server = await createServer({
  server: {
    middlewareMode: true,
    configureServer: (server) => {
      server.middlewares.use((req, res, next) => {
        console.log('Request:', req.url)
        next()
      })
    }
  }
})

Multi-Page Application Support

Configure multiple entry points:

build: {
  rollupOptions: {
    input: {
      main: path.resolve(__dirname, 'index.html'),
      about: path.resolve(__dirname, 'about.html'),
      contact: path.resolve(__dirname, 'contact.html')
    }
  }
}

Directory structure:

src/
├── pages/
│   ├── about/
│   │   ├── index.html
│   │   └── main.js
│   └── contact/
│       ├── index.html
│       └── main.js
└── index.html

Testing Integration

Seamless integration with Vitest testing framework:

// vite.config.js
/// <reference types="vitest" />
import { defineConfig } from 'vite'

export default defineConfig({
  test: {
    globals: true,
    environment: 'happy-dom'
  }
})

Test component example:

import { mount } from '@vue/test-utils'
import Counter from './Counter.vue'

test('increments counter', async () => {
  const wrapper = mount(Counter)
  await wrapper.find('button').trigger('click')
  expect(wrapper.text()).toContain('1')
})

Deployment Strategies

Deployment configurations for different environments:

Static File Deployment

vite build --base=/my-public-path/

SSR Deployment

// vite.config.js
export default defineConfig({
  ssr: {
    format: 'cjs',
    target: 'node'
  }
})

Cloud Platform Deployment

Example Dockerfile:

FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "preview"]

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

Front End Chuan

Front End Chuan, Chen Chuan's Code Teahouse 🍵, specializing in exorcising all kinds of stubborn bugs 💻. Daily serving baldness-warning-level development insights 🛠️, with a bonus of one-liners that'll make you laugh for ten years 🐟. Occasionally drops pixel-perfect romance brewed in a coffee cup ☕.