Vue CLI 轉 Vite 筆記

我並非專職寫前端框架, 但 Vue 我還挺喜歡用的, 因非專職所以之前一直懶的去看看 Vite 的用法, 但最近在寫 Quartz.Net 的 Dashboard 介面頻繁的對 UI 介面除錯, 讓我受不了 Vue CLI 的龜速, 還是乖乖的看看 Vite 如何用如何轉換﹐用過之後果然讓人無法回頭, 我怎麼不早點換呢~

這裏就將 Vue CLI 轉換 Vite 時的一些筆記留下﹐紀錄 CLI 和 Vite 不同之處, 做為日後的參考。

一﹑建立專案

Vue CLI

需要先透過 npm 安裝 vue

npm install -g @vue/cli

再執行

vue create <專案名稱>

專案建立過程會詢問一些問題﹐例如是否使用 Router﹑Vuex﹑Linter﹑Sass/SCSS...再安裝過程中是否一併安裝

Vite

建立 Vite 專案

npm init vite@latest

過程中會詢問的只有專案名稱﹑使用那一種 Framework(不只有支援 Vue)﹑使用那一種語言(Javascript or TypeScript)
如果要使用如 router﹑Sass﹑Linter...之類的都必須另外安裝﹐不會再建立專案時詢問及安裝

另外, Vite 專案建置後會發現檔案結構中並沒有 node_modules 的資料夾, 所以需要先安裝相關的套件

npm install

執行後再檢視就有 node_modules 的資料夾

二﹑ config 檔(Vue.config.js & vite.config.js)

檔案結構對比

vue.config.js

const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
  transpileDependencies: true,
  outputDir: "../wwwwroot",
  configureWebpack: {
    devtool: "source-map"
  },
  //頁面 title
  chainWebpack: config => {
    config.plugin("html").tap(args => {
      args[0].title = "Quartz.Net Dashboard";
      return args;
    });
  }
});

vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    {
      name: 'html-transform',
      transformIndexHtml(html) {
        return html.replace(/<title>(.*?)<\/title>/, '<title>Quartz.Net Dashboard</title>')  // 頁面 title 修改標題
      }
    }
  ],
  build: {
    outDir: '../wwwroot2',  // 指定輸出目錄
    emptyOutDir: true,      // 在 build 之前清空輸出目錄
    sourcemap: true,   // 生成 source map 可以進行前端 browser debug
    // rollupOptions: {
    //   output: {  // build 後的輸出的檔案不帶有哈希值
    //     entryFileNames: 'assets/[name].js',
    //     chunkFileNames: 'assets/[name].js',
    //     assetFileNames: 'assets/[name].[ext]'
    //   }
    // }
  },
  resolve: {
    alias: {
      '@': resolve(__dirname, './src')  // 設置 @ 指向 src
    }
  }
  // server: {
  //   port: 3000   // 可以根據需要修改開發時使用的 port, 若沒有設置則預設為 5173
  // }
})

輸出目錄

vue.config.js

outputDir: "../wwwroot"

vite.config.js

build.outDir: "../wwwroot"

source map

vue.config.js

configureWebpack.devtool: "source-map"

vite.config.js

build.sourcemap: true

頁面 title

vue.config.js

  chainWebpack: config => {
    config.plugin("html").tap(args => {
      args[0].title = "Quartz.Net Dashboard";
      return args;
    });
  }

vite.config.js

import vue from '@vitejs/plugin-vue'

...
  plugins: [
    vue(),
    {
      name: 'html-transform',
      transformIndexHtml(html) {
        return html.replace(/<title>(.*?)<\/title>/, '<title>Quartz.Net Dashboard</title>')  // 頁面 title 修改標題
      }
    }
  ],
...

build 後檔案不產生雜湊值(Hash)

vue.config.js

transpileDependencies: true

vite.config.js

build: {
  rollupOptions: {
    output: {
      entryFileNames: 'assets/[name].js',
      chunkFileNames: 'assets/[name].js',
      assetFileNames: 'assets/[name].[ext]'
    }
  }
}

三﹑ package.json

vue cli

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },

所以在 vue cli 要進行 debug 或 build 時的指令是

npm run serve
npm run build

vite

  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
  },

進行 debug 或 build 的指令

npm run dev
npm run build

四﹑env 環境變數檔

在 vue cli 和 vite 都一樣可以建立 env 環境變檔, 但有一些地方有一些差異, 一般來說會建置類似以下的檔案

  • .env:適用於所有環境
  • .env.local:用於本地環境
  • .env.development:用於開發環境
  • .env.production:用於正式環境
    在每個檔案裏根據不同的環境設定環境變數的值

檔名

在 vue cli 設定 .env.local 這個檔案, 然後在 package.json 的 scripts 中加入

  "scripts": {
    ...
    "serve:local": "vue-cli-service serve --mode local",
    "build:local": "vue-cli-service build --mode local",
    ...
  },

在執行時可以以 npm run server:local 或 npm run build:local 做本地環境變數的執行或建置。
但是, 在 vite 不可以使用 .env.local 這個檔名, 如果像 vue cli 的方式使用﹐在執行 npm run build:local 會出現以下的錯誤

error during build:
Error: "local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.

這是因為 Vite 使用 .local 後綴來處理本地環境變數檔案(例如 .env.local)。當你使用 --mode local 時,Vite 會嘗試加載 .env.local 檔案,但由於 local 是保留的後綴名稱,這會導致衝突。

所以在 Vite 就是避免使用 local 這個關鍵字, 可以將檔名改為 .env.devlocal, 然後在 package.json 中

  "scripts": {
    ...
    "dev:devlocal": "vite --mode devlocal",
    "build:devlocal": "vite build --mode devlocal",
    "preview:devlocal": "vite preview --mode devlocal"
  },

然後指令就是 npm run build:devlocal

環境變數的命名

.env.devlocal 為例

Vue CLI

  • 變數名稱命名必須以 VUE_APP_ 為開頭
  • 使用方式為 process.env.變數名稱
    例如:

Vite

  • 變數名稱命必須以 VITE_ 為開頭
  • 使用方式為 import.meta.env.變數名稱
    例如:

五﹑安裝其它套件

Vite 建立專案時不像 Vue CLI 會詢問而安裝一些相關套件﹐所以如果在 Vite 專案中有需要使用的話都要另外手動安裝, 手動安裝其實跟 Vue CLI 都相同, 這裏做個紀錄只是因為以下這些在過去Vue CLI 都在建置專案時都能選好後自動安裝而 Vite 沒有, 當然在 CLI 建置時沒有選也一樣的方式手動安裝

router

使用以下命令安裝 Vue Router

npm install vue-router@4

設置:

創建資料夾:在 src 資料夾下建立一個 router 資料夾, 在之下建立一個 index.js 檔案

配置 router:在 src/router/index.js 中設置 router

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue')
  }
]

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

export default router
  • 在 main.js 使用 router:在 src/man.js 中引入 vue router

Lint

使用以下命令安裝 ESLint

npm install eslint --save-dev

建立 .eslintrc.js 配置檔案

module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  extends: [
    'plugin:vue/vue3-essential',
    'eslint:recommended',
  ],
  parserOptions: {
    ecmaVersion: 12,
    sourceType: 'module',
  },
  plugins: [
    'vue',
  ],
  rules: {
    // 你的規則
  },
};

Sass

使用以下指令安裝

npm install sass

 


六﹑參考資料

ChatGPT
开始 | Vite 官方中文文档 (vitejs.dev)
配置 Vite | Vite 官方中文文档 (vitejs.dev)
Vite + Vue 3 第一個網站 - HackMD
前端黑洞計畫 (一) : 讓 Vite 來開啟你的Vue :: 2021 iThome 鐵人賽
為什麼前端不愛用 Webpack 了? Vite 簡介 | Vivian Yeh