vue2项目如何将webpack迁移为vite并使用svg解决所有bug问题

 更新时间:2024年03月15日 10:29:47   作者:zxo_apple  
这篇文章主要介绍了vue2项目如何将webpack迁移为vite并使用svg解决所有bug问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

1. vite是跟随vue3诞生的一个工具,它让我们在开发环境中的效率大大提升,其原因是因为它省去了我们在开发环境中的打包过程(因为我们在实际开发环境中是不需要打包的,但是webpack却会去执行打包,大大降低了开发效率),将ES 模块源码直接传输给浏览器,浏览器使用自带的 <script module> 进行解析支持

2. 但是vite其实是基于vue3进行开发的,很多时候我们的老项目使用的都是vue2版本的,这个时候想要使用vite应该怎么做呢

过程

1. 通过vite创建vue项目

npm init @vitejs/app

2. 选择vue模板(还支持react, vanilla, svelte, preact等)

3. 安装老项目中使用到的npm包

注意::这里也安装老项目中的vue2版本,比如我用的是vue2.5.2版本的

4. 将老项目中的src文件复制到vite项目中,并运行

5. 此时运行项目,通常情况下会报错,这个报错信息是因为vite.config.js中使用到的插件仅支持vue3版本以上,所以此时我们需要安装一个支持vue2的插件

支持vue2的插件,并修改vite.config.js文件

npm install vite-plugin-vue2 -D

此时运行项目,发现还会报错,(别急有报错说明还有希望,没报错就GG了,哈哈哈);

根据报错信息知道,找不到vue-template-compiler模块,因此我们安装一下即可

npm install vue-template-compiler -D

安装后再运行项目,发现页面没有出来,打开控制台,又报错。。。

这次是因为找不到#app元素,vue2中挂载dom元素的方式在vite中并未生效,因此我们需要修改main.js中挂载根元素的方式

6. 项目运行后,会发现此时接口请求报错(出现跨域问题,或者404),这是因为vue中代理和vite中代理有区别,需要配置成vite规定的代理

server: {
		port: 8081, // 自己本地需要运行的端口
		fs: { // 不对根目录访问做限制
			strict: false,
		},
		proxy: {
			'/Index': { // 不要写成根路径!!!否则会直接跳转到线上地址
				target: 'http://www.需要代理的地址/',
				changeOrigin: true,
				rewrite: (path) => path.replace(/^\//, '') // 不要写成rewrite: (path) => path.replace(/^\/Index/, '')!!!否则会报404
			},
			'/Home': { // 不要写成根路径!!!否则会直接跳转到线上地址
				target: 'http://www.需要代理的地址/',
				changeOrigin: true,
				rewrite: (path) => path.replace(/^\//, '')
			},
		}
	},

此时再运行,成功!!!!(喜大普奔有没有)

========= vite 增加svg插件使用 =========

vite中使用svg图

1.安装插件

npm i vite-plugin-svg-icons -D

2.配置vite.config.js文件, 并在src下新建文件夹icons,放入要使用的 .svg图片,如下:

// 引入
import viteSvgIcons from 'vite-plugin-svg-icons'

// 插件配置
plugins: [
	viteSvgIcons({
		iconDirs: [path.resolve(process.cwd(), 'src/icons')], // 在src下新建文件夹icons
		symbolId: 'icon-[dir]-[name]'
	})
],

注意:

如果使用 import viteSvgIcons from 'vite-plugin-svg-icons’报错,则需要换成这种写法

import { createSvgIconsPlugin } from ‘vite-plugin-svg-icons'
 createSvgIconsPlugin({
     iconDirs: [path.resolve(process.cwd(), 'src/icons')], // 在src下新建文件夹icons
     symbolId: 'icon-[dir]-[name]'
   })

3. components下新建SvgIcon.vue文件,增加内容

<template>
	<svg aria-hidden="true">
		<use :href="symbolId" rel="external nofollow"  rel="external nofollow"  :fill="color" />
	</svg>
</template>

<script>
	export default {
		name: 'SvgIcon',
		props: {
			prefix: {
				type: String,
				default: 'icon',
			},
			name: {
				type: String,
				required: true,
			},
			color: {
				type: String,
				default: '#333',
			},
		},
		data() {
			return {
				symbolId: ''
			}
		},
		mounted() {
			this.symbolId = `#${this.prefix}-${this.name}`
		},
	}
</script>

<style scoped>
	svg { // 根据开发需求设置css
		width: 20px;
		height: 20px;
	}
</style>

注意⚠️:vue3中SvgIcon组件代码这么写

<template>
  <svg aria-hidden="true" class="svg-icon" :width="props.size" :height="props.size">
    <use :xlink:href="symbolId" rel="external nofollow"  rel="external nofollow"   :fill="props.color" />
  </svg>
</template>
 
<script setup>
import { computed } from 'vue'
const props = defineProps({
  prefix: {
    type: String,
    default: 'icon'
  },
  name: {
    type: String,
    required: true
  },
  color: {
    type: String,
    default: '#ffffff'
  },
  size: {
    type: String,
    default: '1rem'
  }
})
const symbolId = computed(() => `#${props.prefix}-${props.name}`)
</script>

<style scoped>
svg {
  width: 16px;
  height: 16px;
}
</style>

4.main.js中引入

import 'virtual:svg-icons-register'

5.全局注册svg

// main.ts中引入

import SvgIcon from './components/SvgIcon.vue'

createApp(App)
.use(router)
.component('svg-icon', SvgIcon)
.mount('#app')

6.组件中使用svg

template使用

效果图,正常显示。

如果要修改svg颜色,修改icons下 如account.svg中的fill字段为currentColor

页面中设置样式的color即可

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • el-table 动态给每行增加class属性的示例代码

    el-table 动态给每行增加class属性的示例代码

    这篇文章主要介绍了el-table 动态给每行增加class属性的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-03-03
  • Vue如何实现利用vuex永久储存数据

    Vue如何实现利用vuex永久储存数据

    这篇文章主要介绍了Vue如何实现利用vuex永久储存数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 使用Element的InfiniteScroll 无限滚动组件报错的解决

    使用Element的InfiniteScroll 无限滚动组件报错的解决

    这篇文章主要介绍了使用Element的InfiniteScroll 无限滚动组件报错的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • elementui使用el-upload组件实现自定义上传的详细步骤

    elementui使用el-upload组件实现自定义上传的详细步骤

    upload上传是前端开发很常用的一个功能,在Vue开发中常用的Element组件库也提供了非常好用的upload组件,这篇文章主要给大家介绍了关于elementui使用el-upload组件实现自定义上传的详细步骤,需要的朋友可以参考下
    2023-12-12
  • Vue3中的Token失效拦截处理方式

    Vue3中的Token失效拦截处理方式

    这篇文章主要介绍了Vue3中的Token失效拦截处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 详解vue中的动态组件component和keep-alive

    详解vue中的动态组件component和keep-alive

    这篇文章主要介绍了详解vue中的动态组件component和keep-alive的相关资料,这大家需要注意include属性和exclude属性只能用一个,不能同时使用,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • vue改变数据后数据变化页面不刷新的解决方法

    vue改变数据后数据变化页面不刷新的解决方法

    这篇文章主要给大家介绍了关于vue改变数据后数据变化页面不刷新的解决方法,vue比较常见的坑就是数据(后台返回)更新了,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Vue2+ElementUI利用计算属性实现搜索框功能

    Vue2+ElementUI利用计算属性实现搜索框功能

    这篇文章主要为大家详细介绍了Vue2和ElementUI如何利用计算属性实现搜索框功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2024-11-11
  • 栽Vue3中传递路由参数的三种方式

    栽Vue3中传递路由参数的三种方式

    vue 路由传参的使用场景一般都是应用在父路由跳转到子路由时,携带参数跳转,传参方式可划分为 params 传参和 query 传参,本文将给大家介绍如何通过不同方式在 Vue 3 中传递路由参数,需要的朋友可以参考下
    2024-07-07
  • vue 将页面公用的头部组件化的方法

    vue 将页面公用的头部组件化的方法

    本篇文章主要介绍了vue 将页面公用的头部组件化的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论