Vue + Vite 項目部署 Docker 全攻略:原理、路由機制、問題排查與開發代理解析

Vue + Vite 項目部署 Docker 全攻略:原理、路由機制、問題排查與開發代理解析

本文面向希望將 Vue 3 + Vite 項目部署到生產環境(Docker + NGINX)并深入理解路由行為、構建機制與常見問題排查的開發者。


📦 一、項目準備

以 Vue 3 + Vite + Vue Router(history 模式)為基礎結構,假設你項目結構如下:

my-app/
├── src/
│   ├── main.ts
│   ├── App.vue
│   └── router/index.ts
├── index.html
├── vite.config.ts
├── Dockerfile
├── nginx.conf
└── ...

🚀 二、構建產物與部署

1. 構建 Vite 項目

運行:

npm run build

生成的 dist 目錄即為生產環境靜態資源(包含 index.html 和 /assets 目錄)。

2. Dockerfile 示例

# 構建階段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 生產部署階段
FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3. NGINX 配置 nginx.conf

必須添加路由 fallback 規則,否則刷新頁面會 404:

server {listen 80;server_name localhost;root /usr/share/nginx/html;index index.html;location / {try_files $uri $uri/ /index.html;}
}

4. 構建并運行容器

docker build -t vue-app .
docker run -d -p 8080:80 vue-app

🔁 三、路由訪問原理

以 Vue Router 的 history 模式為例,訪問 http://localhost:8080/login 時,完整流程如下:

1. 瀏覽器發起 GET /login 請求
2. NGINX 未找到 /login.html ? fallback 到 /index.html
3. 瀏覽器加載 index.html 中的 /assets/index.[hash].js
4. Vue 應用執行,router 檢測當前路徑為 /login
5. 匹配到 /login 路由,渲染 Login.vue

如圖:

Browser ──GET /login────? NGINX ──fallback──? /index.html│                     │▼                     ▼Vue App 加載          Vue Router 路由解析▼                     ▼渲染 Login.vue     ? Login 頁面展示

🧭 四、常見問題與排查

1. 訪問 /login 顯示 index.html 內容,頁面不渲染組件?

可能原因:

  • App.vue 中未寫 <router-view />
  • Login.vue 模板為空或未正確導出組件
  • 使用了復雜 App.vue 包裹 layout,但 login 頁依賴不滿足導致 setup 被短路
  • 構建后的 chunk 文件加載失敗(JS 路徑不對 / base 配置錯誤)
  • import(‘…/views/Login.vue’) 懶加載路徑大小寫錯誤

建議排查:

  • console.log in main.ts & Login.vue → 是否執行?
  • F12 → Network → JS 文件是否 404?
  • 控制臺是否有紅色錯誤?
  • 使用 vite preview 驗證構建產物是否可用

2. run dev 模式正常,build 后訪問失敗?

開發模式(vite dev):

  • 動態模塊按需加載,容錯強
  • 頁面路徑自動 fallback
  • 即使 Login.vue 結構有問題,也可能渲染成功

構建模式(vite build):

  • 靜態資源路徑必須精確
  • Vue 模塊必須正確導出組件
  • 任一導入錯誤(如路徑拼寫、未 export)將導致頁面白屏

? 為什么 dev 模式能訪問 login,而 build 后失敗?

這是一個非常常見的問題,其核心原因如下:

比較點vite devvite build(部署后)
模塊加載動態、按需、容錯靜態 chunk、路徑嚴格、錯誤即失敗
Vue Router fallback自動支持 history 模式需依賴 nginx try_files 配置
模塊路徑大小寫忽略大小寫錯誤區分大小寫,路徑不對即加載失敗
setup 異常容忍度容錯強,console 報錯但頁面仍可加載setup 異常可能中斷組件加載 ? 白屏
異步 import() 失敗console 警告路由無法 resolve 組件 ? 頁面不渲染

舉例:

  • App.vue 中訪問 localStorage 中的 user_info,但 login 頁并未設置這些字段 ? dev 模式容忍,build 模式直接 setup 錯誤掛掉;
  • import(‘@/views/Login.vue’) 寫錯為 ‘@/Views/Login.vue’,dev 模式不會報錯但 build 后 404;
  • login 頁未使用 <router-view /> 包裹,則 dev 模式可能能跑,build 無響應。

解決方案:

  • 使用 layout 分離 login 與主框架頁面;
  • App.vue 中僅保留 <router-view />;
  • 路由組件路徑大小寫、export default 必須正確;
  • 在 vite preview 中模擬 build 效果進行測試。

🌐 五、代理的作用與使用場景

開發環境中調用 API 常涉及跨域,解決方案是配置 Vite 的代理。

vite.config.ts:

export default defineConfig({server: {proxy: {'/api': {target: 'http://localhost:3000',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}}}
})

示例:fetch(‘/api/user’) 實際會轉發到 http://localhost:3000/user

使用代理的場景:

場景是否需要代理
npm run dev(本地開發)? 是
npm run build + NGINX? 否,需后端支持 CORS 或同源

📘 六、構建建議與最佳實踐

  • 使用 layout + 嵌套路由結構分離 login 與后臺頁面
  • App.vue 僅做 router-view 容器,復雜結構移入 layout
  • 所有懶加載路由組件建議添加 import().catch() 兜底
  • 使用 vite preview 模擬部署環境進行驗證

? 七、總結

Vue + Vite 項目部署到 Docker 時,雖然構建簡單,但需要理解以下關鍵點:

  1. 路由使用 history 模式必須配置 NGINX fallback
  2. 登錄頁等頁面不要被主框架強行包裹
  3. dev 與 build 模式模塊解析行為不同,容忍度不同
  4. 構建后的資源必須正確掛載并引用
  5. 開發代理僅限本地調試,部署后應有真實接口

理解這些機制,才能真正做到:在本地能跑、部署也穩定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87189.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3 + TypeScript 使用 v-bind() 在 <style scoped> 中動態設置 CSS 樣式值

使用要求&#xff1a; Vue 3.3 <style scoped>&#xff0c;Vue 的 v-bind() 在 CSS 中只支持在 scoped style 或 CSS Modules 中使用v-bind("cssVar") 雙引號包裹響應式變量&#xff0c;變量 cssVar 必須是 Vue 的響應式數據&#xff08;如 ref 或 reactive&…

php列表頭部增加批量操作按鈕,多選訂單數據批量微信退款(含微信支付SDK)

index_search.html data-table-id:表格id data-rule:需要傳輸的列表字段 data-action:控制器方法 <a class="layui-btn layui-btn-primary layui-btn-sm" style=

小程序還沒有上線就提示小程序違規,支付失敗

如果出現這種情況&#xff0c;一般情況下不是真正的違規&#xff0c;是因為在小程序后臺&#xff0c;沒有設置訂單詳情頁面的path地址的原因 1.首先看一下&#xff0c;在站內信中是否有相關訂單的通知&#xff1a;站內信&#xff08;小程序通知中心&#xff09;查看是否看到 關…

展開說說Android之Glide詳解_源碼解析

基于上一篇介紹了Glide的使用篇本文分析一下Glide的源碼實現&#xff0c;看看我們簡單幾步就實現的圖片展示功能在源碼中是怎樣完成的。 一、Glide中的核心文件 先逐個介紹一下個人以為的幾個核心類&#xff1a;? 1、Glide Glide是必經的入口&#xff0c;通過Glide.get(con…

商品中心—6.商品考核系統的技術文檔二

大綱 1.基于大數據系統的商品考核數據指標 2.基于商品考核數據指標的商品考核流程 3.商品考核失敗后的處理 考核流程的設計 4.商品考核系統數據庫模型設計 5.商品考核系統核心接口 6.商品生命周期系統的定時考核任務 6.商品生命周期系統的定時考核任務 (1)定時任務處理…

鴻蒙組件通用事件開發全攻略:從基礎交互到工程實踐

一、引言&#xff1a;事件系統 —— 構建交互體驗的核心樞紐 在鴻蒙應用開發體系中&#xff0c;組件事件系統是連接用戶操作與應用邏輯的關鍵橋梁。從基礎的點擊交互到復雜的多觸點手勢&#xff0c;通用事件覆蓋了全場景設備的交互需求。本文將系統解構鴻蒙事件體系的核心機制…

老項目重構難題破解:飛算 JavaAI 如何實現技術升級突圍

在企業數字化轉型進程中&#xff0c;大量 Java 老項目因長期迭代積累的技術債務&#xff0c;陷入 "重構必要性與實施難度并存" 的困境。這些遺留系統普遍存在代碼體系老化、架構模式滯后、維護成本高企等問題&#xff0c;成為企業技術升級的絆腳石。 傳統 Java 老項…

idea使用技巧分享

寫在前面 分享一些常用的idea使用技巧&#xff0c;進來看看有沒有你不知道的。 設置項目默認配置 TODO設置 位置 方式一&#xff1a;setting -> editor -> TODO 方式二&#xff1a; 定義Patterns過濾模式 正則中“\b”是元字符代表著單詞的開頭或結尾&#xff0c;也就…

【Dify精講】第8章:Agent能力實現原理【知識卡片】

第8章&#xff1a;Agent能力實現原理http://www.airinto.com/share/e7b7e27f 一、Agent架構設計 二、工具調用機制 三、ReAct框架實現 四、自定義Agent開發 五、性能優化與監控 六、總結與實戰建議

【軟件】安裝Miniconda

安裝 根據搜索結果&#xff0c;以下是使用Homebrew在macOS上安裝Miniconda的詳細步驟&#xff1a; 1.安裝Homebrew&#xff08;如果尚未安裝&#xff09; 打開終端&#xff08;Terminal&#xff09;&#xff0c;運行以下命令安裝Homebrew&#xff1a; /bin/bash -c "$(…

FastAPI:(6)錯誤處理

FastAPI&#xff1a;(6)錯誤處理 由于CSDN無法展示「漸構」的「#d&#xff0c;#e&#xff0c;#t&#xff0c;#c&#xff0c;#v&#xff0c;#a」標簽&#xff0c;推薦訪問我個人網站進行閱讀&#xff1a;Hkini 「漸構展示」如下&#xff1a; #c 概述 文章概念關系 graph TDA…

408第一季 - 數據結構 - 排序

排序的概念 外部排序很難&#xff0c;后面都是內部排序 插入排序 直接插入排序 理解 這個排序第一輪是從第二個元素開始的 然后是從后往前一個一個比的 然后我們看i5的情況&#xff0c;會出現比較次數和移動次數的概念&#xff0c;這里97動了 然后i8時&#xff0c;49最好…

高效賬號信息管理工具,可安全隨機生成密碼

軟件介紹 今天給大家推薦一款安全可靠的密碼管理工具&#xff0c;幫助用戶輕松管理各類賬號密碼。 安全便捷的密碼解決方案 這是一款采用先進加密技術開發的密碼管理器&#xff0c;不僅可以生成高強度隨機密碼&#xff0c;還提供安全的賬號密碼備份存儲功能。 基礎安全設置 …

如何在markdown文件中(博客)添加emoji表情,讓你的博客看起來更加優雅

在Markdown中使用Emoji的完整指南 按分類快速參考的完整Emoji列表一、狀態指示類:bulb:二、提示信息類:bulb:三、內容類型類:bulb:四、操作指令類:bulb:五、進度狀態類:bulb:六、技術相關類:bulb:七、人員角色類:bulb:八、版本控制類:bulb: 你學會了嗎 按分類快速參考的完整Emo…

MAZANOKE:一款隱私優先的瀏覽器圖像優化工具及Docker部署指南

在日常工作中&#xff0c;大家是否經常遇到這樣的需求&#xff1a;需要壓縮圖片體積、調整圖片尺寸或轉換圖片格式&#xff0c;但又受限于數據安全要求無法將圖片上傳至公網&#xff1f;在我們之前開發的工單配置系統中&#xff0c;這類需求尤為常見。最近在GitHub上發現了一款…

【Vue PDF】Vue PDF 組件初始不加載 pdfUrl 問題分析與修復

Vue PDF 組件初始不加載 pdfUrl 問題分析與修復 問題現象 在開發 PDF 預覽組件時&#xff0c;遇到這樣一個問題&#xff1a; 初始狀態下&#xff0c;PDF 組件不會請求 pdfUrl&#xff08;即不會加載 PDF 文件&#xff09;。只有點擊"全屏"按鈕后&#xff0c;才會請…

《注解的江湖:一場元數據的“宮斗劇”》

一、你真的懂注解嗎 你是否使用過Autowired卻不知道是如何生效的&#xff1f; 這幾個注解你一定很熟悉&#xff1a; OverrideDeprecatedTransactional 那么你有進一步思考過怎么生效的嗎&#xff1f;注解到底是什么&#xff1f;注解&#xff0c;到底是信息&#xff1f;還是指…

智能土木通 - 土木工程專業知識問答系統02-RAG檢索模塊搭建

一、項目目錄 civil_qa_system/ ├── docs/ # 項目文檔 ├── config/ # 配置文件 ├── core/ # 核心功能代碼 ├── knowledge_base/ # 知識庫相關 ├── web/ # Web應用部分 ├…

進程和線程區別、管道和套接字、共享變量、TCP三次握手,是否可以少一次握手、子進程和主進程區別和API——Nodejs

首先講了進程和線程區別 然后講解 管道和套接字&#xff0c;它是進程間通信的方式 接著講解共享變量 &#xff0c;它是線程間通信 最后講解TCP三次握手&#xff0c;因為套接字使用了TCP協議 一、線程和進程的區別 線程&#xff08;Thread&#xff09;和進程&#xff08;Pr…

docker(學習筆記第一課) 使用nginx +https + wordpress

文章目錄 docker(學習筆記第一課) 使用nginx https wordpress學習內容&#xff1a;1. 整體架構1.1 在aws ec2的整體架構1.2 不懂都可以問AI 2. 構建詳細2.1 構建ec22.2 安裝docker2.3 創建一個docker的內部network2.4 創建wordpress使用的mysql數據庫2.5 創建兩個wordpress的d…