【Vite 教學】#04 Vite 生產環境打包與部署

測驗:Vite 生產環境打包與部署

共 5 題,點選答案後會立即顯示結果

1. 執行 npm run build 後,打包好的檔案會放在哪個目錄?

  • A. src/
  • B. build/
  • C. dist/
  • D. public/

2. 打包後的檔名中包含一串類似亂碼的字串(例如 index-CY2Xh8Cq.js),這個字串的用途是什麼?

  • A. 標示打包日期和時間
  • B. 作為內容雜湊值,用於快取控制
  • C. 加密檔案內容以防止盜用
  • D. 隨機產生以避免檔名衝突

3. 下列哪種寫法會觸發 Vite 的程式碼分割(Code Splitting)?

// 選項 A import About from ‘./pages/About.jsx’ // 選項 B const About = () => import(‘./pages/About.jsx’) // 選項 C require(‘./pages/About.jsx’) // 選項 D import * as About from ‘./pages/About.jsx’
  • A. 靜態 import 語句
  • B. 動態 import 語句
  • C. CommonJS require 語句
  • D. 命名空間 import 語句

4. npm run previewnpm run dev 的主要差異是什麼?

  • A. preview 支援熱更新,dev 不支援
  • B. preview 是生產環境伺服器,可用於正式部署
  • C. preview 提供 dist 目錄內容,dev 提供原始碼即時編譯
  • D. 兩者功能完全相同,只是名稱不同

5. 如果要將 Vite 專案部署到 GitHub Pages 的子目錄(例如 /my-app/),需要在 vite.config.js 中設定什麼?

  • A. publicPath: '/my-app/'
  • B. root: '/my-app/'
  • C. outDir: '/my-app/'
  • D. base: '/my-app/'

前言

在前三篇文章中,我們學會了如何建立 Vite 專案、理解開發伺服器的運作方式,以及設定 vite.config.js。現在是時候把專案推向生產環境了。本篇將帶你認識 Vite 的打包流程,解讀打包後的檔案結構,並實際部署到雲端平台。

學習目標

讀完本篇後,你將能夠:

  • 使用 vite build 打包生產環境程式碼
  • 理解打包輸出的檔案結構
  • 部署到 Vercel 或其他靜態網站平台

1. 執行生產環境打包

1.1 基本打包指令

打開終端機,在專案根目錄執行:

npm run build

這個指令實際上是執行 vite build,會將你的專案打包成可部署的靜態檔案。

執行後,你會看到類似這樣的輸出:

vite v5.x.x building for production...
✓ 42 modules transformed.
dist/index.html                  0.45 kB │ gzip:  0.29 kB
dist/assets/index-DiwrgTda.css   1.42 kB │ gzip:  0.74 kB
dist/assets/index-CY2Xh8Cq.js   143.58 kB │ gzip: 46.12 kB
✓ built in 1.23s

這告訴我們:

  • 總共轉換了 42 個模組
  • 產生了 HTML、CSS、JS 三種檔案
  • 顯示了每個檔案的原始大小和 gzip 壓縮後的大小

1.2 打包過程發生了什麼?

當你執行 vite build 時,Vite 會:

  1. 分析依賴關係:掃描所有 import 語句,建立模組依賴圖
  2. 程式碼轉換:將 JSX、TypeScript、Vue SFC 等轉換為瀏覽器可執行的 JS
  3. 打包與壓縮:使用 Rollup 將模組打包,並進行 minify 壓縮
  4. 產生雜湊檔名:在檔名中加入內容雜湊值,確保快取失效正確運作

2. dist 目錄結構解析

打包完成後,會產生一個 dist 目錄。讓我們來看看裡面有什麼:

dist/
├── index.html
├── assets/
│   ├── index-CY2Xh8Cq.js      # 主要 JavaScript 檔案
│   ├── index-DiwrgTda.css     # 樣式表
│   └── logo-BEjGfK1b.png      # 靜態資源
└── favicon.ico
Code language: PHP (php)

2.1 檔名中的雜湊值

注意到 index-CY2Xh8Cq.js 這種檔名了嗎?中間那串看起來像亂碼的字串就是內容雜湊值(content hash)。

index-CY2Xh8Cq.js
      ^^^^^^^^
      內容雜湊值
Code language: CSS (css)

這個機制的好處是:

  • 當檔案內容改變時,雜湊值會跟著變
  • 瀏覽器可以安全地長期快取這些檔案
  • 部署新版本時,舊的快取會自動失效

2.2 index.html 的變化

讓我們比較開發時和打包後的 index.html

開發時(src/index.html):

<script type="module" src="/src/main.jsx"></script>
Code language: HTML, XML (xml)

打包後(dist/index.html):

<script type="module" crossorigin src="/assets/index-CY2Xh8Cq.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DiwrgTda.css">
Code language: HTML, XML (xml)

Vite 自動將開發時的原始碼路徑替換成打包後的資源路徑。


3. 程式碼分割與懶載入

3.1 什麼是程式碼分割?

當專案變大時,把所有程式碼打包成一個檔案會導致首次載入很慢。程式碼分割(Code Splitting)可以將程式碼拆成多個小塊,只在需要時才載入。

3.2 動態 import 觸發分割

Vite 會自動對動態 import 的模組進行程式碼分割:

// 這樣寫會觸發程式碼分割
const About = () => import('./pages/About.jsx')

// 使用 React.lazy 也會觸發
const Dashboard = React.lazy(() => import('./pages/Dashboard.jsx'))
Code language: JavaScript (javascript)

打包後,你會看到多個 JS 檔案:

dist/assets/
├── index-CY2Xh8Cq.js       # 主要程式碼
├── About-Bk3Tz9Xa.js       # About 頁面(懶載入)
└── Dashboard-Dq7Wx2Yb.js   # Dashboard 頁面(懶載入)
Code language: PHP (php)

3.3 如何判斷哪些模組被分割?

查看打包輸出時,注意檔案大小和命名:

dist/assets/index-CY2Xh8Cq.js     143.58 kB  # 主要 bundle
dist/assets/About-Bk3Tz9Xa.js       2.34 kB  # 分割出來的模組
dist/assets/vendor-Xk9Pz3Qa.js     89.21 kB  # 共用的第三方套件
Code language: PHP (php)

vendor 開頭的檔案通常是共用的第三方套件,被分離出來以便快取。


4. 預覽生產版本

在部署之前,你可以在本地預覽打包後的成果:

npm run preview

這會啟動一個本地伺服器,提供 dist 目錄的內容:

  ➜  Local:   http://localhost:4173/
  ➜  Network: http://192.168.1.100:4173/
Code language: JavaScript (javascript)

4.1 preview 與 dev 的差異

特性 npm run dev npm run preview
提供內容 原始碼(即時編譯) dist 目錄
熱更新
效能 開發模式 接近生產環境
用途 開發 部署前驗證

重要npm run preview 只是預覽工具,不是生產環境伺服器。正式部署請使用專門的靜態網站托管服務。


5. 部署到雲端平台

5.1 部署到 Vercel

Vercel 是最簡單的部署選項之一,特別適合前端專案。

步驟一:安裝 Vercel CLI

npm install -g vercel

步驟二:登入 Vercel

vercel login

步驟三:部署

vercel

Vercel 會自動偵測這是 Vite 專案,並執行正確的打包指令。

或者透過 GitHub 整合:

  1. 將專案推送到 GitHub
  2. 在 Vercel 網站連結你的 GitHub 帳號
  3. 選擇要部署的 repository
  4. Vercel 會自動設定好一切

5.2 部署到 Netlify

Netlify 的流程類似:

透過 CLI:

npm install -g netlify-cli
netlify login
netlify deploy --prod --dir=dist

透過網站:

  1. 連結 GitHub repository
  2. 設定 Build command: npm run build
  3. 設定 Publish directory: dist

5.3 部署到 GitHub Pages

如果要部署到 GitHub Pages,需要先調整 vite.config.js

// vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
  base: '/your-repo-name/'  // 設定 base 路徑
})
Code language: JavaScript (javascript)

然後可以使用 gh-pages 套件:

npm install -D gh-pages

package.json 加入部署腳本:

{
  "scripts": {
    "deploy": "npm run build && gh-pages -d dist"
  }
}
Code language: JSON / JSON with Comments (json)

執行部署:

npm run deploy

5.4 各平台比較

平台 優點 適用場景
Vercel 自動偵測框架、預覽部署 各種前端專案
Netlify 表單處理、邊緣函數 需要後端功能的專案
GitHub Pages 免費、與 GitHub 整合 個人專案、文件網站

6. 常見問題排解

6.1 打包後出現白畫面

可能原因: base 路徑設定錯誤

解決方法: 確認 vite.config.js 中的 base 設定與部署路徑一致

// 如果部署在根目錄
base: '/'

// 如果部署在子目錄
base: '/my-app/'
Code language: JavaScript (javascript)

6.2 靜態資源 404

可能原因: 資源路徑使用了絕對路徑

解決方法: 使用 import 或 URL 建構函數

// 不推薦(可能出問題)
<img src="/images/logo.png" />

// 推薦(Vite 會正確處理)
import logo from './assets/logo.png'
<img src={logo} />
Code language: JavaScript (javascript)

6.3 打包檔案太大

排查方法: 使用 rollup-plugin-visualizer 分析

npm install -D rollup-plugin-visualizer
// vite.config.js
import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig({
  plugins: [
    react(),
    visualizer({ open: true })
  ]
})
Code language: JavaScript (javascript)

執行 npm run build 後會自動開啟一個視覺化報告,顯示各模組佔用的空間。


總結

本篇介紹了 Vite 生產環境打包與部署的完整流程:

  1. 打包指令npm run build 將專案打包到 dist 目錄
  2. 檔案結構:了解雜湊檔名和資源組織方式
  3. 程式碼分割:透過動態 import 自動分割程式碼
  4. 預覽功能npm run preview 在部署前驗證成果
  5. 部署平台:Vercel、Netlify、GitHub Pages 各有優勢

至此,【Vite 教學】系列四篇文章全部完成。你已經具備了使用 Vite 進行前端開發的完整知識,從建立專案、理解開發伺服器、設定配置檔,到最終的打包部署。現在就開始用 Vite 建立你的下一個專案吧!


延伸閱讀

進階測驗:Vite 生產環境打包與部署

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你的專案打包後,主要 JS 檔案高達 500KB。PM 要求優化首次載入效能。根據文章內容,你應該優先考慮哪種做法? 情境題

  • A. 將所有程式碼壓縮成一個更小的檔案
  • B. 使用動態 import 將不立即需要的頁面進行程式碼分割
  • C. 關閉 minify 壓縮以加快打包速度
  • D. 改用 npm run dev 直接上線以避免打包

2. 同事部署了 Vite 專案到 GitHub Pages 後,打開網頁卻是白畫面。Console 顯示 JS 和 CSS 檔案都是 404。可能的原因是什麼? 錯誤診斷

// 同事的 vite.config.js import { defineConfig } from ‘vite’ import react from ‘@vitejs/plugin-react’ export default defineConfig({ plugins: [react()] }) // 部署網址:https://username.github.io/my-project/
  • A. 沒有安裝 gh-pages 套件
  • B. 忘記執行 npm run build
  • C. 缺少 base: '/my-project/' 設定
  • D. GitHub Pages 不支援 Vite 專案

3. 你需要在部署前確認打包後的網站功能正常。根據文章,最適合的做法是什麼? 情境題

  • A. 直接部署到正式環境測試
  • B. 執行 npm run preview 在本地預覽 dist 目錄
  • C. 用 npm run dev 確認開發模式正常即可
  • D. 直接用瀏覽器開啟 dist/index.html 檔案

4. 你想分析專案打包後各模組佔用的空間大小,找出造成 bundle 過大的原因。根據文章,應該使用什麼工具? 情境題

  • A. webpack-bundle-analyzer
  • B. Chrome DevTools 的 Coverage 功能
  • C. npm run build –verbose
  • D. rollup-plugin-visualizer

5. 新同事使用以下方式引用圖片,部署後圖片顯示 404。問題出在哪裡? 錯誤診斷

// 新同事的寫法 function Logo() { return <img src=”/images/logo.png” /> } // 打包後部署到 Vercel,圖片 404
  • A. Vercel 不支援 PNG 圖片格式
  • B. 應該使用 import 語句引入圖片,讓 Vite 正確處理路徑
  • C. 圖片檔案太大被 Vite 自動忽略
  • D. 需要在 vite.config.js 設定 assetsInclude 選項

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *