vue-cli升級(jí)到vite(vue2升級(jí)到vue3)

老項(xiàng)目升級(jí),遇到的幾個(gè)問題和升級(jí)要點(diǎn)
老項(xiàng)目
"vue": "^2.5.17",
"@vue/cli-service": "^3.0.5",

新項(xiàng)目
"vite": "^3.0.0",
"vue": "^3.2.37",

新建項(xiàng)目

重新建立一個(gè)項(xiàng)目,使用vite生成項(xiàng)目;然后添加所用的依賴
1、yarn create vite my-vue-app --template vue

  1. 添加 axios、vue-router、vuex、vant、clipboard等;

組件引入

在vite中,默認(rèn)在導(dǎo)入組件時(shí)是不支持省略.vue,所以要把路徑補(bǔ)全;

// 之前 (Vue 2.x)
import cart from './cart'

// 之后 (Vue 3.x)
import cart from './cart/index.vue'

vue.prototype

使用globalProperties
添加一個(gè)可以在應(yīng)用的任何組件實(shí)例中訪問的全局 property。組件的 property 在命名沖突時(shí)具有優(yōu)先權(quán)。
這可以代替 Vue 2.x 的 Vue.prototype 擴(kuò)展:

// 之前 (Vue 2.x)
Vue.prototype.$http = () => {}

// 之后 (Vue 3.x)
const app = createApp({})
app.config.globalProperties.$http = () => {}

環(huán)境變量

使用.env文件,將原先的 VUE_ 開頭的變量使用 VITE_ 進(jìn)行替換,需要注意,無法直接在vite.config.js文件中直接使用環(huán)境變量,需要使用 loadEnv 處理

import { defineConfig, loadEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
import { resolve } from 'path';

// https://vitejs.dev/config/
export default ({ mode }) => {
  const VITE_APP_ENV_TITLE = loadEnv(mode, process.cwd()).VITE_APP_ENV_TITLE;
  const VITE_APP_BASE = loadEnv(mode, process.cwd()).VITE_APP_BASE;
  console.log({
    NODE_ENV: process.env.NODE_ENV || 'development',
    VITE_APP_ENV_TITLE: VITE_APP_ENV_TITLE,
    VITE_APP_BASE: VITE_APP_BASE,
  });

  return defineConfig({
    plugins: [
      vue(),
      Components({
        resolvers: [VantResolver()],
      }),
    ],
    base: VITE_APP_BASE,
    server: {
      // 設(shè)置默認(rèn)端口
      port: 8083,
      // 設(shè)置代理
      proxy: {
        '/mobile_web_shopkeeper': {
          // 目標(biāo) API 地址
          target: 'https://baidu.com.cn',
          changeOrigin: true,
          pathRewrite: {
            '^/mobile_web_shopkeeper': '/mobile_web_shopkeeper',
          },
        },
      },
    },
    resolve: {
      alias: [{ find: '@', replacement: resolve(__dirname, 'src') }],
    },
  });
};

require

不能使用 require ,需要用 import { resolve } from 'path'; 代替。

// 之前 (Vue 2.x)
const {resolve} = require('path');

// 之后 (Vue 3.x)
import { resolve } from 'path';

import Vue from "vue";

vue3 不再導(dǎo)出 vue,需要使用實(shí)例對(duì)象,如果原來的代碼里面有使用,需要?jiǎng)h除;

// 之前 (Vue 2.x)
import Vue from "vue";

// 之后 (Vue 3.x)
// import Vue from "vue";

vue-router

  1. new Router 改成 createRouter
  2. mode: "history", 改為 history: createWebHistory(),
// 之前 (Vue 2.x)
import Router from "vue-router";

const router = new Router({
  mode: "history",
  routes:[]
});

// 之后 (Vue 3.x)
import { createRouter, createWebHistory } from 'vue-router';

const router = createRouter({
  history: createWebHistory(),
  routes:[],
});

vuex

new Vuex.Store 改為 createStore

// 之前 (Vue 2.x)
import Vuex from 'vuex'
export default new Vuex.Store({
  state,
  mutations,
  actions,
  getters
})

// 之后 (Vue 3.x)
import { createStore } from 'vuex';
export default createStore({
  state,
  mutations,
  actions,
  getters,
});

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容