最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue Cli項(xiàng)目重構(gòu)為Vite的方法步驟

 更新時(shí)間:2023年04月20日 09:05:11   作者:AntPro  
本文主要介紹了Vue Cli項(xiàng)目重構(gòu)為Vite的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們知道 VueCli 使用的是 webpack 打包工具,而 Vite 是基于 ESM 的打包工具,所以我們可以使用 Vite 來替換 VueCli,來提升我們的開發(fā)體驗(yàn)。

更新依賴與 package.json

我們先將項(xiàng)目中的 VueCli 相關(guān)依賴刪除,然后安裝 Vite 相關(guān)依賴。

::: tip 包管理工具我們使用 pnpm,如果你使用的是 npmyarn,請自行替換。 :::

  • 刪除 VueCli 相關(guān)依賴
pnpm remove @vue/cli-plugin-babel @vue/cli-plugin-eslint @vue/cli-service
  • 安裝 Vite 相關(guān)依賴

::: warning 注意 如果你用的是 vue2.6, 請安裝 vite-plugin-vue2, 并且不需要 jsx 支持 :::

pnpm add -D vite @vitejs/plugin-vue @vitejs/plugin-vue2 @vitejs/plugin-vue2-jsx
  • 同時(shí)我們可以移除 babel 相關(guān)依賴
pnpm remove -D babel-plugin-dynamic-import-node babel-eslint
  • 修改 scripts

修改 package.json 中的 scripts

{
  "scripts": {
    "dev": "vite --host",
    "build:prod": "vite build",
    "build:stage": "vite build --mode staging"
  }
}

配置 Vite

  • 創(chuàng)建 vite.config.js,并添加基本配置
import { defineConfig, loadEnv } from 'vite';
// 如果使用的是 vue2.6, 請使用 vite-plugin-vue2
// import { createVuePlugin as vue } from 'vite-plugin-vue2';
import vue from '@vitejs/plugin-vue2';
import { resolve } from 'path';
import rollupNodePolyFill from 'rollup-plugin-node-polyfills';
import { dataToEsm } from '@rollup/pluginutils';
import vueJsx from '@vitejs/plugin-vue2-jsx';

export default ({ mode }) => {
  process.env = { ...process.env, ...loadEnv(mode, process.cwd(), '') };

  return defineConfig({
    plugins: [
      // vue2.6
      // vue({ jsx: true }),
      // vue2.7
      vue(),
      vueJsx(),
    ],
    server: {
      port: 75,
      proxy: {
        [process.env.VITE_APP_BASE_API]: {
          target: process.env.VITE_APP_PROXY_API,
          changeOrigin: true,
          rewrite: (path) => path.replace(new RegExp(`^${process.env.VITE_APP_BASE_API}`), ''),
        },
      },
    },
    resolve: {
      alias: {
        '@': resolve('src'),
      },
      extensions: ['.js', '.vue', '.json'],
    },
  });
};
  • 如果你的項(xiàng)目中使用了 node 的一些模塊,需要在 resolve.alias 中添加對應(yīng)的 polyfill

::: tip 提示 需要添加 rollup-plugin-node-polyfills 依賴 :::

defineConfig({
  // ...
  resolve: {
    alias: {
      '@': resolve('src'),
      // 如果你的項(xiàng)目中使用了node的一些模塊,需要在這里添加對應(yīng)的polyfill,如沒有配置.js的extensions,需要在末尾添加.js
      path: 'rollup-plugin-node-polyfills/polyfills/path',
  }
})
  • 如果你的項(xiàng)目需要使用 build 的配置,可以參考如下配置
defineConfig({
  // ...
  build: {
    rollupOptions: {
      output: {
        chunkFileNames: 'js/[name]-[hash].js',
        entryFileNames: 'js/[name]-[hash].js',
        assetFileNames: 'assets/[ext]/[name]-[hash][extname]',
        // 分離依賴包
        manualChunks: {
          vue: ['vue'],
          echarts: ['echarts'],
          'element-ui': ['element-ui'],
        },
      },
    },
  },
});
  • 移除 vue.config.js
  • 若你的項(xiàng)目中使用了 jsx,請將 '.js' 文件修改為 '.jsx'

全局替換 Env 變量與 require

  • 將所有的 process.env 替換為 import.meta.env,如:
// 替換前
const uploadFileUrl = process.env.VUE_APP_BASE_API + '/upload';
// 替換后
const uploadFileUrl = import.meta.env.VITE_APP_BASE_API + '/upload';

::: tip 參考正則 process\.env\.VUE_APP_ replace import.meta.env.VITE_APP_ :::

::: danger 注意 請勿將 vite.config.js 中的 process.env 替換為 import.meta.env :::

  • 將所有直接導(dǎo)入的 require 替換為 import,如:
// 替換前
const { version } = require('../../package.json');
// 替換后
import { version } from '../../package.json';

::: tip 參考正則 const\s+\{(.+?)\}\s+=\s+require\((.+?)\); replace import {$1} from $2; :::

  • 移除動態(tài)導(dǎo)入的 require.context,如:
// 替換前
const svgIcons = require.context('@/assets/icons/svg', false, /\.vue$/);
// 替換后
const svgIcons = import.meta.globEager('@/assets/icons/svg'); 
  • 動態(tài)導(dǎo)入的 Vue 路由組件需要調(diào)整為 import(),如:
// 替換前
route.component = () => require([`@/views/${route.component}`]);
// 替換后

// 動態(tài)導(dǎo)入
const views = import.meta.glob('@/views/**/**.vue');
route.component = views[`@/views/${route.component}.vue`];

// 確定文件路徑的動態(tài)導(dǎo)入
// 替換前
route.component = () => require('@/views/index/index');
// 替換后
route.component = () => import('@/views/index/index.vue');

調(diào)整 ESLint 配置

移除 babel-eslint parser

// .eslintrc.js
module.exports = {
  // ...
  // 移除
  // parser: 'babel-eslint',
  // ...
};

調(diào)整 index.html

移動 public/index.htmlindex.html,并添加 JavaScript 模塊 的引入方式

<!-- ... -->
<script type="module" src="/src/main.js"></script>
<!-- ... -->

::: tip 提示 <script>標(biāo)簽一般添加在 </body> 前 :::

SVG 支持

  • 安裝依賴
pnpm add -D vite-plugin-svg-icons
  • 修改 vite.config.js,參考配置如下:
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';

defineConfig({
  // ...
  plugins: [
    // ...
    createSvgIconsPlugin({
      // 圖標(biāo)文件夾中,所有的svg文件將被轉(zhuǎn)換為svg精靈
      iconDirs: [resolve(process.cwd(), 'src/assets/icons/svg')],
      // 指定symbolId格式
      symbolId: 'icon-[dir]-[name]',
    }),
  ],
});
  • 添加虛擬模塊至入口文件,如:
// src/main.js
// ...
import 'virtual:svg-icons-register';
// ...
  • 添加 SvgIcon/index.vue 組件
<template>
  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName" rel="external nofollow"  />
  </svg>
</template>

<script>
import { isExternal } from '@/utils/validate';

export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true,
    },
    className: {
      type: String,
      default: '',
    },
  },
  computed: {
    isExternal() {
      return isExternal(this.iconClass);
    },
    iconName() {
      return `#icon-${this.iconClass}`;
    },
    svgClass() {
      if (this.className) {
        return 'svg-icon ' + this.className;
      } else {
        return 'svg-icon';
      }
    },
    styleExternalIcon() {
      return {
        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`,
      };
    },
  },
};
</script>

<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}

.svg-external-icon {
  background-color: currentColor;
  mask-size: cover !important;
  display: inline-block;
}
</style>

總結(jié)

至此,我們已經(jīng)完成了 vue-cli 項(xiàng)目的遷移,接下來我們可以使用 vite 的各種優(yōu)勢了。

如果遇到構(gòu)建產(chǎn)物無法正常使用的情況,請?jiān)谀愕膭討B(tài)路由中導(dǎo)入 import.meta.glob

參考

到此這篇關(guān)于Vue Cli項(xiàng)目重構(gòu)為Vite的方法步驟的文章就介紹到這了,更多相關(guān)Vue Cli項(xiàng)目重構(gòu)為Vite內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue和webpack項(xiàng)目構(gòu)建過程常用的npm命令詳解

    vue和webpack項(xiàng)目構(gòu)建過程常用的npm命令詳解

    本文通過實(shí)例代碼給大家介紹了vue和webpack項(xiàng)目構(gòu)建過程常用的npm命令,需要的朋友可以參考下
    2018-06-06
  • vue3+elementPlus實(shí)現(xiàn)年份選擇器

    vue3+elementPlus實(shí)現(xiàn)年份選擇器

    這篇文章主要為大家詳細(xì)介紹了vue3如何通過elementPlus實(shí)現(xiàn)一個(gè)簡單的年份選擇器,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • vue和thymeleaf相結(jié)合的注意事項(xiàng)詳解

    vue和thymeleaf相結(jié)合的注意事項(xiàng)詳解

    這篇文章主要介紹了vue和thymeleaf相結(jié)合的注意事項(xiàng)詳解,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue.js實(shí)現(xiàn)數(shù)據(jù)雙向綁定的代碼示例

    Vue.js實(shí)現(xiàn)數(shù)據(jù)雙向綁定的代碼示例

    在我們使用vue的時(shí)候,當(dāng)數(shù)據(jù)發(fā)生了改變,界面也會跟著更新,但這并不是理所當(dāng)然的,我們修改數(shù)據(jù)的時(shí)候vue是如何監(jiān)聽數(shù)據(jù)的改變以及當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候vue如何讓界面刷新的,所以本文就給大家講講Vue.js 數(shù)據(jù)雙向綁定是如何實(shí)現(xiàn)的
    2023-07-07
  • vue3響應(yīng)式API之ref的使用

    vue3響應(yīng)式API之ref的使用

    這篇文章主要介紹了vue3響應(yīng)式API之ref的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue 組件復(fù)用多次自定義參數(shù)操作

    Vue 組件復(fù)用多次自定義參數(shù)操作

    這篇文章主要介紹了Vue 組件復(fù)用多次自定義參數(shù)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue中用JSON實(shí)現(xiàn)刷新界面不影響倒計(jì)時(shí)

    Vue中用JSON實(shí)現(xiàn)刷新界面不影響倒計(jì)時(shí)

    這篇文章主要為大家詳細(xì)介紹了Vue中用JSON實(shí)現(xiàn)刷新界面不影響倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • vue3如何使用watch監(jiān)聽props中的數(shù)據(jù)

    vue3如何使用watch監(jiān)聽props中的數(shù)據(jù)

    在vue項(xiàng)目中,父子組件數(shù)據(jù)傳遞是最常見的場景,但是今天在開發(fā)過程中父級數(shù)據(jù)傳遞到子組件,控制子組件的顯隱,下面這篇文章主要給大家介紹了關(guān)于vue3如何使用watch監(jiān)聽props中數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Vue 針對瀏覽器參數(shù)過長實(shí)現(xiàn)瀏覽器參數(shù)加密解密的操作方法

    Vue 針對瀏覽器參數(shù)過長實(shí)現(xiàn)瀏覽器參數(shù)加密解密的操作方法

    文章介紹了如何在Vue項(xiàng)目中使用crypto-js庫對瀏覽器參數(shù)進(jìn)行加密和解密,以解決參數(shù)過長的問題,在router/index.js中添加了相關(guān)代碼,并在utils工具類中添加了encryption.js和query.js源碼,感興趣的朋友一起看看吧
    2024-12-12
  • vue實(shí)現(xiàn)拖拽小圖標(biāo)

    vue實(shí)現(xiàn)拖拽小圖標(biāo)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)拖拽小圖標(biāo),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

慈溪市| 青冈县| 永城市| 安西县| 德江县| 渝北区| 日照市| 新营市| 西和县| 新安县| 沧源| 会同县| 迁西县| 望城县| 乌鲁木齐市| 台前县| 永仁县| 化隆| 绥中县| 社旗县| 南江县| 彭水| 鹤岗市| 翼城县| 康平县| 泌阳县| 正阳县| 奉新县| 赤壁市| 南乐县| 庄河市| 呼玛县| 临潭县| 大埔县| 南陵县| 吴忠市| 茂名市| 德安县| 伊吾县| 枝江市| 兴隆县|