首页 > 其他分享 >第5章 Vite高级功能(一)

第5章 Vite高级功能(一)

时间:2024-07-09 20:55:16浏览次数:8  
标签:功能 高级 别名 HMR import vite Vite defineConfig

文章目录


Vite 提供了许多高级功能,使开发者能够更灵活、高效地构建和优化项目。本章将深入探讨这些高级功能,包括别名与路径解析、代理与跨域配置、热模块替换 (HMR)、动态导入与代码分割、预构建与依赖优化。

1. 别名与路径解析

在大型项目中,使用路径别名可以使代码更简洁易读。Vite 支持通过 vite.config.js 文件配置路径别名。

1 配置别名

vite.config.js 中使用 resolve.alias 配置路径别名。

import { defineConfig } from 'vite'
import path from 'path'

export default defineConfig({
  resolve: {
    alias: {
      // '@' 将指向 'src' 目录
      '@': path.resolve(__dirname, 'src'),
      // 'components' 将指向 'src/components' 目录
      'components': path.resolve(__dirname, 'src/components')
    }
  }
})

2 使用别名

在代码中使用配置的路径别名:

// 使用 '@' 别名导入 src 目录下的模块
import utils from '@/utils'
// 使用 'components' 别名导入 src/components 目录下的模块
import MyComponent from 'components/MyComponent.vue'

export default {
  components: {
    MyComponent
  }
}

2 代理与跨域配置

在开发过程中,经常会遇到跨域请求的问题。Vite 提供了方便的代理配置,帮助开发者解决跨域问题。

2.1 配置代理

vite.config.js 中使用 server.proxy 配置代理:

import { defineConfig } from 'vite'

export default defineConfig({
  server: {
    proxy: {
      // 代理 /api 到 http://localhost:3000
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  }
})

2.2 使用代理

在代码中发送请求:

import axios from 'axios'

axios.get('/api/users')
  .then(response => {
    console.log(response.data)
  })
  .catch(error => {
    console.error('Error fetching users:', error)
  })

上述配置中,所有发往 /api 的请求都会被代理到 http://localhost:3000,并移除路径中的 /api 前缀。

3 热模块替换 (HMR)

热模块替换 (HMR) 允许在应用运行时替换、添加或删除模块,而无需重新加载整个页面。Vite 内置 HMR 支持,使得开发体验更加流畅。

3.1 HMR 基本使用

Vite 默认启用了 HMR,你无需额外配置即可享受 HMR 带来的便利。以下是一个使用 HMR 的简单示例:

// src/main.js
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)
app.mount('#app')

// HMR 接口
if (import.meta.hot) {
  import.meta.hot.accept((newModule) => {
    app.unmount()
    app.mount('#app')
  })
}

3.2 HMR 高级使用

在复杂的应用中,你可能需要更细粒度的 HMR 控制。以下是一个处理局部模块更新的示例:

// src/store.js
import { reactive } from 'vue'

export const store = reactive({
  count: 0
})

// 处理 HMR
if (import.meta.hot) {
  import.meta.hot.accept((newModule) => {
    // 替换旧的 store
    Object.assign(store, newModule.store)
  })
}

4 动态导入与代码分割

动态导入和代码分割有助于优化应用的性能,减少初始加载时间。Vite 内置对动态导入的支持,使得实现代码分割变得非常简单。

4.1 动态导入

使用 import() 函数进行动态导入:

// src/main.js
document.getElementById('loadButton').addEventListener('click', async () => {
  const { greet } = await import('./utils.js')
  console.log(greet('Vite'))
})

4.2 代码分割

Vite 自动进行代码分割,将动态导入的模块分割到单独的文件中。你可以通过 build.rollupOptions 进行更细粒度的控制:

import { defineConfig } from 'vite'

export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        // 手动控制代码分割
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return 'vendor'
          }
        }
      }
    }
  }
})

5 预构建与依赖优化

Vite 使用 esbuild 对依赖进行预构建,提高开发服务器的启动速度和模块热更新速度。

5. 1预构建依赖

在首次启动开发服务器时,Vite 会自动预构建依赖。你可以在 vite.config.js 中通过 optimizeDeps 进行配置:

import { defineConfig } from 'vite'

export default defineConfig({
  optimizeDeps: {
    include: ['axios', 'lodash'],
    exclude: ['vue-demi']
  }
})

5.2 手动预构建依赖

如果需要手动预构建依赖,可以使用 Vite 提供的 optimize 命令:

npx vite optimize

5.3 调试预构建

在开发过程中,你可能需要调试预构建的依赖。可以通过 optimizeDeps.debug 选项启用调试模式:

import { defineConfig } from 'vite'

export default defineConfig({
  optimizeDeps: {
    debug: true
  }
})

标签:功能,高级,别名,HMR,import,vite,Vite,defineConfig
From: https://blog.csdn.net/imdeity/article/details/140213114

相关文章

  • 第5章 Vite高级功能(二)
    文章目录6缓存和持久化6.1配置缓存目录7压缩与最小化7.1启用压缩7.2配置压缩选项8生产环境优化8.1移除调试信息8.2配置环境变量9静态资源优化9.1压缩图像9.2合并和压缩CSS9.3使用HTTP/210分析构建结果10.1使用分析插件10.2生成包分析报告6缓......
  • 全能型CAE/CFD建模工具SimLab 详解Part1: Geomtry,轻松集成力学、电磁学、疲劳优化等功
    SimLab的建模功能SimLab集成了结构力学,流体力学,电磁学,疲劳和优化等功能,是全能型的CAE/ CFD建模工具。具有强大的几何、网格编辑功能,能够快速的清理复杂模型,减少手动修复的工作量,提高建模效率。具有CAD参数双向识别功能,可识别Inspire/Creo/Catia/NX设计参数......
  • 探秘odpdx32.dll:核心功能解析与缺失修复指南
    odpdx32.dll是一个动态链接库(DLL)文件,通常与DirectX或OpenGL相关的软件或游戏有关。这个文件可能包含了用于处理图形渲染和多媒体播放的函数和资源,是系统中重要的组件之一。当你的计算机在运行某些应用程序时提示缺少odpdx32.dll文件,这意味着该应用程序依赖于这个文件,但当前系......
  • java+selenium+autoIt 实现下载(打印)功能
    java+selenium+autoIt实现下载(打印)功能selenium是一个开源的自动化测试框架,它可以模拟用户对浏览器的操作,进行自动化的测试。但是,它不仅仅只能用来做测试。AutoIt是一个使用类似BASIC脚本语言的免费软件,它设计用于WindowsGUI(图形用户界面)中进行自动化操作。它利用模拟键盘......
  • 【goreplay】python简单使用goreplay中间件功能
    一、场景   流量录制,需要对播放的流量进程定制化处理,那么可以使用中间件来实现  二、官网https://pypi.org/project/gor/  三、编写中间件代码#coding:utf-8importsysfromgor.middlewareimportAsyncioGordefon_request(proxy,msg,**kwargs):......
  • excel下载功能
    excel下载功能:(就是一个超链接href属性,路径:保存xlsx文件的路径)<ahref="${pageContext.request.contextPath}/file/导入代码模板.xlsx">下载导入模板</a>在webapp下,创建一个file文件夹,把要下载的资源丢进file文件夹中   声明:此博客为个人学习之用,如与其他作品雷同......
  • 邮箱验证的重要性,EDM邮件营销群发管理工具--Geeksend邮件营销邮箱验证功能的过人之处
    在进行邮件营销之前,我们是否有必要对收件邮箱进行验证?显然是很有必要的!下面我将总结了几点有关邮箱验证的重要性:邮箱验证的重要性提高邮件营销效果:通过验证真实的邮箱地址,确保邮件能够准确地送达目标用户,从而提高邮件营销活动的转化率。降低营销成本:避免向无效或错误的邮箱......
  • 掌握BERT:从初学者到高级的自然语言处理(NLP)全面指南
    掌握BERT:从初学者到高级的自然语言处理(NLP)全面指南原文:https://medium.com/@shaikhrayyan123/a-comprehensive-guide-to-understanding-bert-from-beginners-to-advanced-2379699e2b51本文是对该文的翻译,感谢RayyanShaikh在Medium论坛上的文章~引言:BERT(BidirectionalEnc......
  • Java高级-线程池
    1.什么是线程池?用于管理线程对象的池子。2.为什么使用线程池?一个线程大约占用内存1M。 1.解决频繁创建线程和销毁线程消耗的性能。 2.解决大量创建线程而导致的内存泄漏问题。3.如何创建线程池?Java中提供了两种方式:第一种:通过工具类完成线程池的创建-:语法简......
  • Linux系统运维命令:查看http的并发请求数及其TCP连接状态(使用netstat结合awk和sort,组合
    一、需求二、解决方法(一)解决思路(二)命令三、实例演示和命令解释(一)实例演示(二)命令解释四、扩展一、需求用户访问一个视频监控平台的web服务特别频繁,据客户说,有大概2000个用户,要随机访问这个视频监控平台,这样对带宽的要求非常大。因此,他们需要查看到底有多少个http的并......