如何从Webpack迁移到Vite
本文将介绍如何将前端web应用程序从 Webpack 升级到 Vite。
Vite 是最新的前端开发工具,其受欢迎程度和采用率都在大幅增长。可以查看下图中来自 npm trends 的下载。
推动这一趋势的是 Vite 核心的一个关键概念:开发人员体验。与 Webpack 相比,Vite 在开发过程中能显著缩短构建时间和热重载时间。它通过利用浏览器中的 ES 模块等现代浏览器功能来实现这一目标。
在我们深入探讨从 Webpack 迁移到 Vite 的过程之前,值得注意的是,前端开发领域正在不断发展,Vite 并不是唯一受到关注的工具。esbuild 是另一款速度惊人的 JavaScript 捆绑程序和精简程序,正吸引着网络开发人员的目光。如果你正在寻找一种零配置的方法,你可能还想了解一下 Parcel,它为许多开发人员提供了无缝体验。
注意事项
虽然 Vite 为你的工作流引入了许多令人兴奋的新特性,但与任何新技术一样,也有一些缺点需要考虑。与 Webpack 这样成熟的工具相比,首先考虑的是第三方插件的生态系统。
在 Webpack 使用的十年间,npm 上有数十个核心/官方 Webpack 插件和数百(可能数千)个社区贡献的插件。虽然 Vite 的插件支持非常好,但你可能会发现,项目所依赖的插件并没有与 Vite 对应的插件,这可能会成为你迁移到 Vite 的障碍。
安装Vite
迁移项目的第一步是创建一个新的 Vite 应用程序,并探索要迁移到的工具。你可以用以下方法为新的 Vite 应用程序制作模板:
npm create vite@latest
然后开启开发服务:
npm run dev
现在,在浏览器中导航到显示的 localhost URL。
Vite 将创建一个包含下图所示的文件目录。
其中许多内容你都不会陌生,可以在你的应用程序中进行类似替换。
更改package.json
要开始在现有 Webpack 项目中使用 Vite,请前往要迁移的 Webpack 项目的 package.json,然后安装 Vite:
npm install –save vite
根据你使用的前端框架,你可能还需要安装特定的框架插件:
npm install –save @vitejs/plugin-react
你还可以更新任何构建脚本,使用 Vite 代替 Webpack:
–  "build": "webpack --mode production",
–  "dev": "webpack serve",
++   "build": "vite build",
++  "dev": "vite serve",
同时,卸载Webpack:
npm uninstall –save webpack webpack-cli wepack-dev-server
现在再来试试新的开发脚本吧!
npm run dev
vite.config
除非你非常幸运,否则很可能需要添加一些额外的配置。Vite 使用 vite.config.js 文件进行配置,这在很大程度上类似于现有的 webpack.config.js 文件。
你可以在 vitejs.dev 上找到 Vite 配置的完整文档,但 React 应用程序的简单 Vite 配置可能如下所示:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
  plugins: [react()],
  },
})
插件
在插件内部,Vite 使用 Rollup 作为构建工具,你可以通过 npm 安装任何 Rollup 插件,将其添加到 Vite 中:
npm install –save @rollup/plugin-image
同时将它们添加到 vite.config.js 文件的plugins数组中:
// vite.config.js
import image from '@rollup/plugin-image'
import { defineConfig } from 'vite'
export default defineConfig({
  plugins: [
      image(),
  ],
})
等价Vite插件
接下来看看一些流行的Webpack插件和等价的Vite插件。
HtmlWebpackPlugin -> vite-plugin-html
HtmlWebpackPlugin 可简化 HTML 文件的创建,以便为 Webpack 捆绑包提供服务。如果你在项目中使用 HtmlWebpackPlugin,Vite 的 vite-plugin-html 插件也能提供类似功能。你可以这样安装:
npm install --save-dev vite-plugin-html
在vite.config.js中这样引入:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { createHtmlPlugin } from 'vite-plugin-html'
export default defineConfig({
  plugins: [
    react(),
    createHtmlPlugin({
      entry: 'src/main.js',
      template: 'public/index.html',
      inject: {
        data: {
          title: 'index',
          injectScript: `<script src="./inject.js"></script>`,
        },
    })
  ]
})
MiniCssExtractPlugin -> vite-plugin-purgecss
MiniCssExtractPlugin 是 Webpack 的一个插件,用于将 CSS 提取到单独的文件中。它会为每个包含 CSS 的 JavaScript 文件创建一个 CSS 文件。它通常用于生产环境,以提高 CSS 的加载效率。这样做有两个好处。首先,浏览器可以单独缓存 CSS。其次,由于 CSS 不再嵌入 JavaScript 文件中,因此可以与 JavaScript 同步加载,从而加快页面加载速度,防止出现没有样式的文本。
在Vite中,可以使用vite-plugin-purgecss:
npm install --save-dev vite-plugin-html-purgecss
在vite.config.js中这么使用:
import htmlPurge from 'vite-plugin-html-purgecss'
export default {
    plugins: [
        htmlPurge(),
    ]
}
CopyWebpackPlugin -> vite-plugin-static-copy
CopyWebpackPlugin 用于将单个文件或整个目录复制到构建目录。Vite 也有一个类似的插件,名为 vite-plugin-static-copy:
npm install --save-dev vite-plugin-static-copy
将下列代码放入vite.config.js:
import { viteStaticCopy } from 'vite-plugin-static-copy'
export default {
  plugins: [
    viteStaticCopy({
      targets: [
        {
          src: 'bin/example.wasm',
          dest: 'wasm-files'
        }
      ]
    })
  ]
}
DefinePlugin -> define()
在 Webpack 中,DefinePlugin 用于在编译时用分配值替换源代码中的标记。这样就可以创建可在编译时配置的全局常量。在 Vite 中,你可以使用 vite.config.js 中的 define 选项实现同样的效果,因此可能不需要插件:
export default defineConfig({
  define: {
    'process.env.NODE_ENV': JSON.stringify('production'),
  },
})
总结
这是一份将前端 Webpack 应用程序迁移到 Vite 的简单指南,其中包括一些最常用的 Webpack 插件。
如果你的项目是一个大型复杂项目,构建过程错综复杂,Webpack 功能丰富、配置灵活,可能仍然是你的最佳选择。
如果你迁移的是一个较小或中等规模的项目,Vite 确实能提供一些便利。无论是服务器启动还是热模块替换,它的速度都能显著提高开发效率。其配置的简洁性也是一个受欢迎的优势,而且它在设计时考虑到了原生 ES 模块和现代框架的兼容性,这为它的未来发展奠定了良好的基础。
从 Webpack 过渡到 Vite 确实需要仔细规划和测试,尤其是在考虑插件替换或重构时。但这一举措也会带来可观的回报。Vite 提供了一个更快、更精简的开发环境,最终能带来更顺畅、更高效的开发工作流程。
时刻关注工具的发展变化总是有益的。也可以考虑探索其他现代工具,如 esbuild 和 Parcel,以找到最适合你项目需求的工具。
请记住,工具并不是最重要的,重要的是如何使用它来实现目标。Webpack、Vite、esbuild 和 Parcel 都是优秀的工具,至于使用哪种工具最好,则取决于你的具体需求和限制条件。
以上就是本文的全部内容,如果对你有所帮助,欢迎点赞、收藏、转发~
如何从Webpack迁移到Vite的更多相关文章
- webpack 项目接入Vite的通用方案介绍(上)
		愿景 希望通过本文,能给读者提供一个存/增量项目接入Vite的点子,起抛砖引玉的作用,减少这方面能力的建设成本 在阐述过程中同时也会逐渐完善webpack-vite-serve这个工具 读者可直接fo ... 
- antd+react项目迁移vite的解决方案
		antd+react+webpack往往是以react技术栈为主的前端项目的标准组合,三者都有成熟的生态和稳定的表现,但随着前端圈的技术不断革新,号称下一代构建平台vite2的发布,webpack似乎 ... 
- 拥抱下一代前端工具链-Vue老项目迁移Vite探索
		作者:京东物流 邓道远 背景描述 随着项目的不断维护,代码越来越多,项目越来越大.调试代码的过程就变得极其痛苦,等待项目启动的时间也越来越长,尤其是需要处理紧急问题的时候,切换项目启动,等待的时间就会 ... 
- Vue3 全家桶,从 0 到 1 实战项目,新手有福了
		前端发展百花放,一技未熟百技出.未知何处去下手,关注小编胜百书. 我是前端人,专注分享前端内容! 本篇文章主要是,使用 vite 创建一个vue3 项目,实践 vie-router4 vuex4 结合 ... 
- 科技爱好者周刊(第 175 期):知识广度 vs 知识深度
		这里记录每周值得分享的科技内容,周五发布. 本杂志开源(GitHub: ruanyf/weekly),欢迎提交 issue,投稿或推荐科技内容. 周刊讨论区的帖子<谁在招人?>,提供大量程 ... 
- Module Federation 模块联邦 在Vue3中使用Vue2搭建的微服务
		前言: 备注:本文基于对webpack Module Federation有一定了解的情况下 一般情况下使用模块联邦都是会使用相同的版本,如Vue2的组件时在Vue2中使用,但我为什么会在Vue3项目 ... 
- 【Vue】计算属性 监听属性 组件通信 动态组件 插槽 vue-cli脚手架
		目录 昨日回顾 1 计算属性 插值语法+函数 使用计算属性 计算属性重写过滤案例 2 监听属性 3 组件介绍和定义 组件之间数据隔离 4 组件通信 父子通信之父传子 父子通信之子传父 ref属性 扩展 ... 
- Fis3迁移至Webpack实战
		Webpack从2015年9月第一个版本横空初始至今已逾2载.它的出现,颠覆了一大批主流构建如Ant.Grunt和Gulp等等.腾讯NOW直播IVWEB团队之前一直采用Fis构建,本篇文章主要介绍从F ... 
- Fis3构建迁移Webpack之路
		Webpack从2015年9月第一个版本横空初始至今已逾2载.它的出现,颠覆了一大批主流构建如Ant.Grunt和Gulp等等.腾讯NOW直播IVWEB团队之前一直采用Fis构建,本篇文章主要介绍从F ... 
- 什么,你还使用 webpack?别人都在用 vite 搭建项目了
		一.vite 到底是干嘛的? vite 实际上就是一个面向现代浏览器,基于 ES module 实现了一个更轻快的项目构建打包工具. vite 是法语中轻快的意思. vite 的特点: 1.轻快的冷服 ... 
随机推荐
- RR有幻读问题吗?MVCC能否解决幻读?
			幻读是 MySQL 中一个非常普遍,且面试中经常被问到的问题,如果你还搞不懂什么是幻读?什么是 MVCC?以及 MySQL 中的锁?那么请好好收藏和阅读本篇文章,因为它非常重要. RR 隔离级别 在 ... 
- AVR汇编(二):AVR架构介绍
			AVR汇编(二):AVR架构介绍 ATmega328P介绍 ATmega328P是Atmel公司(现Microchip公司)推出的一个基于AVR架构的高性能低功耗单片机,拥有32KB的Flash.1K ... 
- Linux下发现一个高安全性的系统管理工具
			软件 AnySetup 主要功能 主要功能是对Linux操作系统下的基本配置进行管理.多种服务配置进行管理.安全配置进行管理等.如:操作系统的升级管理,软件包的安装.更新和卸载管理,软件仓库源的管理, ... 
- lea指令调用
			lea指令(Load Effective Address)在x86汇编语言中的作用是将一个有效地址(即一个内存地址或寄存器地址的偏移量)加载到目标寄存器中,而不是加载一个实际的内存值. lea指令的使 ... 
- centos7.X安装mysql5.7 – 东凭渭水流
			1.下载mysql5.7 可以使用windows下载好后上传至Linux.网络条件好的推荐使用 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/m ... 
- C#中的ConcurrentExclusiveSchedulerPair类
			为什么使用ConcurrentExclusiveSchedulerPair? 现实生活中的例子是一个停车场的入口和出口,多辆车可以同时进入和离开停车场,但是只有一个车辆可以进入或离开一次. 这时候就需 ... 
- Elasticsearch之索引简单应用
			本篇所有操作都在 Kibana 上执行 创建第一个索引 PUT product { // 索引设置 "settings": { // 分片数量 "number_of_sh ... 
- Understanding UML in seconds
			UML 是一种分析设计语言,也就是一种建模语言. UML结构解析 UML其结构主要包括以下几个部分: 视图(View) 多个图形组成的集合: 图(Diagram) 图的种类有13种图,但常用的也就两种 ... 
- 关于关闭Sublime Text自动更新提示
			Sublime Text默认提示自动更新,实在让人烦不胜烦,那么有没有办法解决嘞,那当然是有的,下面就教你如何关闭Sublime Text自动更新提示 首先注册,不注册的话,一切操作都没有用:(注册码 ... 
- Docker CE
			3. 安装Docker CE Docker有两个分支版本:Docker CE和Docker EE,即社区版和企业版.本教程基于CentOS 7安装Docker CE. 执行如下命令,安装Docker的 ... 
