ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

全面解析 Vite:原理、与 Webpack 对比、配置实战与性能优化

全面解析 Vite:原理、与 Webpack 对比、配置实战与性能优化 全面解析 Vite原理、与 Webpack 对比、配置实战与性能优化【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine本文基于 refine 官方博客《What is Vite? Vite vs Webpack》一文原文结合 refine 仓库中真实的 Vite 示例工程与源码配置系统讲解 Vite 的核心工作原理、开发体验优势、迁移方法与可落地的自定义配置。读完本文你将理解 Vite 为何快掌握vite.config.js各项核心配置的含义并能在 refine 项目中直接套用这些配置与性能优化技巧。引言从 ES Modules 的演进看构建工具的痛点在现代 Web 开发中速度和效率往往决定一个项目的成败。开发者始终在寻找能简化工作流、交付更优性能的工具而**打包bundling**这一环节的历史几乎与模块化组织代码的需求一样长。ES ModulesESM的出现一度解决了模块化问题代码按模块分组模块内的变量可以被其他模块按需访问开发者体验因此大幅改善。然而无论是直接使用 ES Module 规范还是为了让不支持 ESM 的浏览器也能工作而引入 webpack问题很快浮现——当应用规模变大依赖的模块数以千计时构建过程变得极其缓慢成为开发者的噩梦。正是这个痛点催生了Vite。Vite 由 Vue.js 的创造者 Evan You 发起其目标就是简化并加速前端开发的构建循环既让开发期的本地伺服快如闪电又让生产构建高效稳定。什么是 ViteJavaScript 构建工具常常让开发者头疼尤其是当你想专注业务开发时。Vite 是当下最主流的解决此类问题的工具之一。从根本上看Vite 只做两件事并且做得很好在开发阶段本地伺服代码——利用浏览器原生的 ES Modules 能力按需加载模块不预先打包在生产阶段打包所有前端资源HTML、CSS、JS 等——生成经过优化的产物。Vite 在浏览器中原生使用 ES Modules这使得无论模块依赖有多大、应用代码有多庞大代码都能被即时加载。同时Vite 实现了热模块替换HMR它会监听应用的状态变化在应用运行期间仅添加/移除发生变化的模块而不触发整页刷新。对开发者而言这意味着你在编写代码的同时就能在浏览器里实时看到修改效果。Vite 如何解决性能挑战Vite 从三个层面回答了为什么它更快原生 ES Modules 支持现代浏览器原生支持 ESMVite 在开发期完全拥抱这一能力直接把 ES Modules 作为独立文件交给浏览器加载省去打包环节换来更快的启动速度和更好的缓存性浏览器还可并行加载多个模块整体性能随之提升。闪电般的构建过程生产构建时 Vite 借助esbuild——以速度著称的打包器——生成优化、压缩后的代码束。相比传统打包器esbuild 的快速打包能力显著缩短构建时间加快部署节奏提升开发者生产力。代码分割与懒加载Vite 开箱即用地支持代码分割Code Splitting与懒加载Lazy Loading。将代码库拆分为更小的 chunk只在需要时加载必要模块降低首屏加载时间懒加载进一步让应用的特定部分按需加载优化加载过程与用户体验。Vite 的核心特性作为现代前端构建工具Vite 提供了一系列与传统打包器截然不同的特性极速开发服务器高度优化的开发服务器依托现代浏览器对原生 ESM import 的支持采用**按需编译on-demand compilation**策略实现近乎即时的 HMR 与快速页面刷新显著加速开发工作流提供更短的反馈循环。原生 ES Modules 支持开发期不做打包直接利用浏览器加载 ESM 的能力消除打包开销带来更快的启动速度与更好的缓存性。极速生产构建生产构建使用 esbuild 生成优化压缩后的代码束构建时间大幅缩短部署周期更快。零配置哲学Vite 遵循零配置理念开箱即用让开发者无需在复杂配置上耗时同时提供灵活的vite.config.js用于高级定制。DevTools 集成Vite 与主流浏览器开发者工具无缝集成通过将原始源码映射到浏览器开发者无需额外配置即可直接调试。插件生态Vite 拥有持续增长的插件生态可与 Vue、React、Preact 等主流前端框架集成扩展功能、优化体验并打通更多工具链。Vite vs Webpack两种开发服务器模式与 Vite 类似的打包工具有 webpack、Rollup、Parcel 等但核心差异在于Vite 使用基于原生 ES Modules 的开发服务器而 webpack 使用基于打包的开发服务器。在 Vite 的开发服务器模式下浏览器直接以原生 ESM 加载各个模块文件开发期不必要的打包被完全避免构建时间大幅缩减、速度显著提升在 webpack 的开发服务器模式下所有模块需要先被收集、打包为 bundle 后再交给浏览器模块越多打包耗时越长Vite 采用简化且有主见的配置方式配置文件极小易于上手webpack 则以其极其丰富的配置选项著称允许开发者微调打包过程的每个细节庞大的插件与 loader 生态使其高度灵活、适配各种项目需求。两者各有取舍Vite 胜在开发体验与默认速度webpack 胜在生态广度与细粒度控制力。项目中的真实对照refine 同时提供 Webpack 与 Vite 两种工程形态refine 仓库本身就是理解两者差异的最佳样本同一套核心能力既有基于 Vite 的工程如 examples/starter-vite、examples/with-material-ui-vite、examples/with-remix-vite-headless也有大量基于 webpack/CRA 时代的示例。对比这些示例的package.json与vite.config.ts可以直观看到 Vite 工程的脚本和配置有多精简。从 Webpack 迁移到 Vite如果你想把现有 webpack 应用迁移到 Vite可以按以下步骤操作安装 Vite 及其插件参考官方 Getting Started 指南安装vite与对应框架插件如vitejs/plugin-react。确保项目使用 ES Modules在package.json中加入type: module,移除 webpack 配置文件删除webpack.config.js等文件新建vite.config.js并更新 scriptsbuild: vite build, dev: vite serve,清理不再使用的 loader 与插件删除已无用的 webpack loaders/plugins 后完整测试应用确保一切正常。补充迁移后在 refine 中可用refine命令替代原生脚本迁移完成后如果你使用的是 refine CLI见 documentation/docs/guides-concepts/development/index.md官方推荐用 refine 的 runner 代替原生 Vite 脚本以便在启动开发服务器的同时获得 DevTools 联动、更新检查与公告通知等附加能力scripts: { - dev: vite, - build: vite build, - start: vite preview dev: refine dev, build: refine build, start: refine start }在实战中使用 Vite脚手架一个 React 项目使用 Vite 创建 React 项目# npm 6.x npm create vitelatest my-react-app --template react # npm 7需要额外的双破折号 npm create vitelatest my-react-app -- --template react然后进入项目目录、安装依赖并启动开发服务器cd react-vite npm install npm run dev脚手架生成的package.json中scripts提供了开发、构建与本地预览三组命令{ scripts: { dev: vite, build: vite build, preview: vite preview } }dev启动开发服务器别名vite dev、vite servebuild生产构建preview在本地预览生产构建产物。仓库中的真实 Vite 工程refine Starterrefine 仓库自带的 examples/starter-vite 是一个完整的 Vite React refine 最小工程可直接对照学习package.json 声明了type: module脚本使用refine dev/refine build/refine start即上文的 CLI runner 方式并依赖vite^5.4.15与vitejs/plugin-react^4.2.1vite.config.ts 简洁得只剩核心配置import { defineConfig } from vite; import react from vitejs/plugin-react; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], });index.html 展示了 Vite 的入口约定——div idroot/div配合script typemodule src/src/main.tsx这就是浏览器原生加载 ESM的落地形式src/main.tsx 使用ReactDOM.createRoot挂载应用与常规 React 工程一致。同类参考还有 examples/with-material-ui-viteVite Material UI 的管理面板示例与 examples/with-remix-vite-headlessRemix 通过remix vite:dev/remix vite:build驱动 Vite并额外使用vite-tsconfig-paths插件解析路径别名。自定义 Vite 配置Vite 高度灵活通过根目录的vite.config.js少量调整即可让构建完全适配你的工程与工作流。基础配置// vite.config.js import { defineConfig } from vite; export default defineConfig({ // configuration options });开发服务器定制配置端口、自动打开浏览器与代理设置// vite.config.js import { defineConfig } from vite; export default defineConfig({ server: { port: 3000, // 修改端口 open: true, // 自动打开浏览器 proxy: { /api: { target: http://localhost:5000, changeOrigin: true, }, }, }, });proxy在前后端分离开发时尤为实用将/api前缀的请求转发到后端服务并重写请求来源头避免跨域问题。路径别名配置别名能缩短 import 路径提升代码可读性// vite.config.js import { defineConfig } from vite; import path from path; export default defineConfig({ resolve: { alias: { : path.resolve(__dirname, ./src), }, }, });配置后即可使用import X from /components/X形式的路径。若你使用 TypeScript还需在tsconfig.json的paths中同步声明例如仓库中 examples/with-remix-vite-headless 就通过vite-tsconfig-paths插件让 Vite 直接读取 tsconfig 中的路径映射。插件配置Vite 支持大量插件以扩展能力例如处理 Vue 文件// vite.config.js import { defineConfig } from vite; import vue from vitejs/plugin-vue; export default defineConfig({ plugins: [vue()], });对应到 React 工程则是vitejs/plugin-react见 examples/with-material-ui-vite/vite.config.ts。环境变量通过.env文件按阶段development、production 等定义环境变量// .env VITE_API_URLhttp://localhost:5000在代码中通过import.meta.env读取仅VITE_前缀的变量会暴露给客户端代码// example.js console.log(import.meta.env.VITE_API_URL);构建选项通过build配置优化产物的性能与输出形态// vite.config.js import { defineConfig } from vite; export default defineConfig({ build: { outDir: dist, sourcemap: true, rollupOptions: { output: { manualChunks: { vendor: [react, react-dom], }, }, }, }, });outDir产物输出目录默认distsourcemap生成 source map便于线上调试manualChunks手动把react、react-dom等第三方库拆分为独立的vendorchunk利用浏览器缓存提升二次加载速度。Vite 性能优化实战以下配置能让开发过程更快、构建性能更优可直接合并进你的vite.config.js。用 esbuild 加速构建Vite 底层使用 esbuild它以极速著称可显式开启相关能力// vite.config.js import { defineConfig } from vite; export default defineConfig({ esbuild: { minify: true, }, });代码分割Vite 默认会自动把代码拆分为多个 chunk 以优化缓存与加载还可通过rollupOptions进一步微调。下面的配置把node_modules中的依赖统一归入vendorchunk// vite.config.js import { defineConfig } from vite; export default defineConfig({ build: { rollupOptions: { output: { manualChunks(id) { if (id.includes(node_modules)) { return vendor; } }, }, }, }, });Tree Shaking开启 tree shaking删除死代码// vite.config.js import { defineConfig } from vite; export default defineConfig({ build: { treeshake: true, }, });懒加载通过动态import()按需加载模块// example.js import(path/to/module).then((module) { // use module });结合 React 的React.lazy与Suspense这是优化首屏加载最常用的手段。optimizeDeps预打包依赖预先打包依赖让开发服务器启动更快// vite.config.js import { defineConfig } from vite; export default defineConfig({ optimizeDeps: { include: [react, react-dom], }, });Vite 会在首次启动时将include中的依赖预构建为缓存后续启动直接复用。压缩Minification确保生产环境下 JS 与 CSS 都被压缩。CSS 可用cssnano配合 PostCSSJS 用 esbuild 压缩// vite.config.js import { defineConfig } from vite; import cssnano from cssnano; export default defineConfig({ css: { postcss: { plugins: [cssnano()], }, }, build: { minify: esbuild, }, });注使用cssnano需先安装cssnano依赖Vite 4 默认构建压缩器即 esbuild也可切换为terser。大型库走 CDN把体积庞大的库交给 CDN减少 bundle 体积// vite.config.js import { defineConfig } from vite; export default defineConfig({ resolve: { alias: { vue: https://cdn.jsdelivr.net/npm/vue3.2.31/dist/vue.esm-browser.js, }, }, });通过resolve.alias将vue指向 CDN 的 ESM 版本本地不再打包该库。缓存失效Cache Busting开启带 hash 的文件名确保用户始终获取最新文件// vite.config.js import { defineConfig } from vite; export default defineConfig({ build: { manifest: true, rollupOptions: { output: { entryFileNames: assets/[name].[hash].js, chunkFileNames: assets/[name].[hash].js, assetFileNames: assets/[name].[hash].[ext], }, }, }, });manifest: true会生成一份manifest.json配合 hash 文件名可实现内容级缓存——文件内容变化时 hash 变化浏览器自然加载新文件内容不变则命中缓存。结语Vite 通过极速开发服务器、原生 ES Modules 支持与闪电般的生产构建彻底革新了前端开发体验。从理解其原理到对比 webpack再到迁移、自定义配置与性能优化本文覆盖了从入门到实战的完整路径。如果你正在使用或计划使用 refine 构建内部工具与管理面板可以直接参考仓库中的 examples/starter-vite 与 examples/with-material-ui-vite 两个工程将上文配置落地到自己的项目里亲自感受 Vite 带来的开发效率提升。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表