search
  • Sign In
  • Sign Up
Password reset successful

Follow the proiects vou are interested in andi aet the latestnews about them taster

Table of Contents
1. Understand the Key Differences
2. Update Project Structure and Entry Points
3. Replace Webpack Loaders with Vite Plugins
4. Adjust Build and Dev Scripts
5. Handle Environment Variables Differently
6. Optimize for Production
7. Test and Debug
Home Web Front-end H5 Tutorial From Webpack to Vite: A Migration Guide for Frontend Projects

From Webpack to Vite: A Migration Guide for Frontend Projects

Aug 08, 2025 am 02:02 AM

Understand key differences: Vite uses native ES modules for faster development, esbuild for dependency pre-bundling, and Rollup for production builds, offering quicker cold starts and HMR than Webpack’s full bundling approach. 2. Update project structure: Set index.html as the entry point in the root or src directory with a module script tag, and use explicit file extensions in imports like './App.tsx' to comply with ESM standards. 3. Replace Webpack loaders with Vite plugins: Use @vitejs/plugin-react for React, vite-plugin-checker for TypeScript, built-in support for CSS, install sass for SCSS, and handle static assets via public/ or src/assets. 4. Adjust scripts in package.json: Replace Webpack commands with "dev": "vite", "build": "vite build", and "preview": "vite preview" while removing old Webpack scripts. 5. Handle environment variables: Use .env files with VITE_ prefix (e.g., VITE_API_URL) to expose variables to client code via import.meta.env.VITE_API_URL. 6. Optimize production build: Leverage automatic code splitting, place large assets in public/, set base path in config for subdirectory deployment, and use Rollup plugins in build.rollupOptions.plugins for advanced control. 7. Test thoroughly: Check for HMR issues, verify environment variables, confirm asset paths resolve, ensure CI/CD runs vite build, and watch for missing extensions, incorrect aliases, or unprocessed public assets. Migrating from Webpack to Vite improves build speed and developer experience by leveraging modern tooling, and with structured refactoring, most projects can complete the transition within a day or two, especially when starting small and using Vite’s sensible defaults.

Migrating from Webpack to Vite is becoming a common step for frontend developers looking to improve build performance and developer experience. While Webpack has long been the go-to bundler, Vite offers faster hot module replacement (HMR), quicker cold starts, and a more modern development server powered by native ES modules. If you're considering the switch, here’s a practical guide to help you transition smoothly.


1. Understand the Key Differences

Before diving into migration, it’s important to grasp how Vite differs from Webpack:

  • Development vs. Production Approach:
    Vite serves source files over native ES modules during development, bypassing the need to bundle everything upfront. Webpack, on the other hand, bundles all assets even in dev mode, which can slow things down as your app grows.

  • Build Speed:
    Vite uses esbuild for pre-bundling dependencies and Rollup for production builds—both are faster than Webpack’s JavaScript-based bundling.

  • Configuration Model:
    Webpack configurations can become complex with multiple loaders and plugins. Vite aims for simplicity with sensible defaults and a cleaner config structure.

Knowing these differences helps set realistic expectations and guides how you’ll refactor your setup.


2. Update Project Structure and Entry Points

Vite expects a slightly different project layout, though it’s flexible. Here are the typical adjustments:

  • HTML Entry Point:
    Vite uses index.html as the entry point (not index.js). Make sure your index.html is in the root of your src or project directory and includes a script tag pointing to your main JS/TS file:

    <!-- src/index.html -->
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title>App</title>
      </head>
      <body>
        <div id="root"></div>
        <script type="module" src="/src/main.ts"></script>
      </body>
    </html>
  • File Extensions in Imports:
    During development, Vite requires explicit file extensions for .ts, .jsx, etc., in import statements (due to native ESM behavior). For example:

    // Instead of
    import App from './App'
    
    // Use
    import App from './App.tsx'

    You can partially mitigate this with resolve.extensions in config, but it's better to follow ESM standards.


3. Replace Webpack Loaders with Vite Plugins

You won’t need most Webpack loaders directly, but Vite supports plugins for similar functionality:

Webpack LoaderVite Equivalent
babel-loader@vitejs/plugin-react or vite-plugin-react-babel
ts-loader / fork-ts-checker-webpack-pluginNative TypeScript support vite-plugin-checker
css-loader / style-loaderBuilt-in CSS support
file-loader / url-loaderStatic assets handled via public/ or src/assets
sass-loaderInstall sass and use .scss files directly
Custom loadersLook for Vite-specific plugins or write a custom Vite plugin

Example: Add React TypeScript support

npm install --save-dev @vitejs/plugin-react vite-plugin-checker
// vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import checker from 'vite-plugin-checker'

export default defineConfig({
  plugins: [
    react(),
    checker({ typescript: true })
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  }
})

Note: Use path from node:path and import it accordingly if using ESM.


4. Adjust Build and Dev Scripts

Update your package.json scripts:

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  }
}
  • vite: Starts dev server
  • vite build: Produces production assets
  • vite preview: Locally test production build

Also remove Webpack-specific scripts like webpack serve or webpack --mode production.


5. Handle Environment Variables Differently

Vite uses .env files with a specific naming convention:

  • .env – loaded in all cases
  • .env.local – local overrides (git-ignored)
  • .env.development / .env.production – mode-specific

Prefix environment variables with VITE_ to expose them to the client:

VITE_API_URL=https://api.example.com

Access in code:

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

This replaces Webpack’s DefinePlugin or dotenv.


6. Optimize for Production

While Vite is fast out of the box, consider these production tips:

  • Code Splitting: Vite automatically code-splits based on dynamic imports and Rollup’s tree-shaking.
  • Asset Handling: Large assets go in public/ (served as-is), smaller ones in src/assets (processed).
  • Base Path: If deploying to a subdirectory, set base: '/my-app/' in vite.config.js.
  • Custom Rollup Plugins: Use them in the build.rollupOptions.plugins array for advanced control.

7. Test and Debug

After migration:

  • Run npm run dev and check for 404s or HMR issues.
  • Verify environment variables are accessible.
  • Check asset paths (images, fonts) still resolve.
  • Ensure your CI/CD pipeline runs vite build successfully.

Common gotchas:

  • Missing file extensions in imports
  • Incorrect alias resolution
  • Public assets not copied correctly
  • Old Webpack aliases (like ~) not working

Migrating from Webpack to Vite isn’t just a config swap—it’s a shift toward a faster, more modern toolchain. With a bit of refactoring, most projects can make the leap in a day or two, especially if they’re using React, Vue, or plain JS/TS. The performance gains in development alone often justify the effort.

Basically, start small: set up Vite alongside Webpack, migrate one app at a time, and lean on Vite’s defaults before over-configuring.

The above is the detailed content of From Webpack to Vite: A Migration Guide for Frontend Projects. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

ArtGPT

ArtGPT

AI image generator for creative art from text prompts.

Stock Market GPT

Stock Market GPT

AI powered investment research for smarter decisions

Popular tool

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to detect if a browser supports HTML5 features? (Modernizr) How to detect if a browser supports HTML5 features? (Modernizr) Mar 04, 2026 am 03:11 AM

The main reason for the failure of Modernizr detection is that the script is not successfully loaded or executed at an improper time. It is necessary to ensure that it is loaded synchronously, avoids CSP interception, and is executed before DOM construction. As an alternative, it is preferable to use CSS@supports and native API to detect empty scripts.

How to use the template tag for dynamic content in HTML5? (Cloning nodes) How to use the template tag for dynamic content in HTML5? (Cloning nodes) Mar 05, 2026 am 02:15 AM

The template tag itself does not render and must be manually cloned and inserted. Template is a lazy container of HTML5. The browser will parse it but completely skip rendering and script execution. If you write Hello directly, nothing will appear on the page - this is not a bug, it is the design. To make it "alive", you must use JavaScript to extract the content, clone it, and then hang it on the DOM. A common mistake is to directly obtain document.querySelector('template').content and then try to appendChild. The result is an error or no response: because the content is a Docu

How to make a phone number clickable in HTML5? (Tel link) How to make a phone number clickable in HTML5? (Tel link) Mar 05, 2026 am 02:29 AM

The correct way to write it is href="tel: 8613812345678". All non-numeric characters need to be cleared (only and numbers are retained). Mainland China numbers must be prefixed with 86. Extension numbers use;ext= format, and target="_blank" is disabled.

How to disable autocomplete on input fields in HTML5? (Form attributes) How to disable autocomplete on input fields in HTML5? (Form attributes) Mar 05, 2026 am 02:31 AM

Autocomplete="off" sometimes does not take effect because modern browsers (such as Chrome ≥ 80) actively ignore it to ensure the password manager experience; to be truly effective, it needs to be combined with strategies such as semantic values ​​(such as new-password), avoiding sensitive names, and dynamically generated attributes.

How to create a progress bar for file uploads in HTML5? (Progress tag) How to create a progress bar for file uploads in HTML5? (Progress tag) Mar 06, 2026 am 02:22 AM

Why can't the tag directly display the upload progress? It is a read-only visual component. It does not listen to network requests and is not automatically bound to the upload process of XMLHttpRequest or fetch. If you put it in and don't update the value manually, it will always stop at 0%. What really drives it is the event monitoring in the upload logic you write yourself. A common mistake is to only monitor onload (upload completed) but miss upload.onprogress. XMLHttpRequest (not fetch) must be used to obtain real-time upload progress, because fetch does not expose the max attribute of the event in the upload phase and must be set to the file size (file.size

How to create a tooltip using only HTML5? (Title attribute) How to create a tooltip using only HTML5? (Title attribute) Mar 06, 2026 am 12:23 AM

The title attribute is not a tooltip component, but an accessibility prompt mechanism implemented by the browser. The behavior, style, and interaction are uncontrollable and are only suitable for simple scenarios such as pure information supplement.

How to center an image vertically in HTML5? (Layout techniques) How to center an image vertically in HTML5? (Layout techniques) Mar 07, 2026 am 02:05 AM

Flexbox is the most stable for centered images. The key is to set display:flex and align-items:center in the parent container and specify the height; using place-items:center for Grid is more concise; absolute positioning requires top:50% with transform:translateY(-50%); vertical-align is invalid for block-level centering.

How to insert a copyright symbol in HTML5? (Character entities) How to insert a copyright symbol in HTML5? (Character entities) Mar 05, 2026 am 02:57 AM

© and © have the same effect. The former is a named entity and is easy to read, while the latter is a decimal digital entity and has more stable compatibility. It is necessary to avoid the problems of CSS hiding, JS unescapement and missing semantics.

Related articles