Vue.js 多項(xiàng)目同端口部署實(shí)戰(zhàn)指南(上下文路徑配置指南)
Vue.js 多項(xiàng)目同端口部署實(shí)戰(zhàn):上下文路徑配置指南
一、背景與需求
在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到這樣的需求:
已有的服務(wù)器上運(yùn)行著一個(gè) Vue 項(xiàng)目(主項(xiàng)目),現(xiàn)在需要在不開(kāi)啟新端口的情況下,部署另一個(gè) Vue 項(xiàng)目(如數(shù)據(jù)大屏、管理后臺(tái)等),通過(guò)不同的路徑前綴來(lái)區(qū)分訪問(wèn)。
例如:
- 主項(xiàng)目:
http://your-domain.com/(已運(yùn)行) - 數(shù)據(jù)大屏:
http://your-domain.com/datav/(需要新增)
這種部署方式稱為上下文路徑(Context Path)部署。本文將從前端 Vue.js 配置到后端服務(wù)器部署,詳細(xì)介紹完整的實(shí)現(xiàn)方案。
二、核心概念:上下文路徑
上下文路徑是指 Web 應(yīng)用在服務(wù)器上的部署路徑前綴。通過(guò)設(shè)置不同的上下文路徑,多個(gè)應(yīng)用可以共享同一個(gè) IP 和端口,通過(guò) URL 路徑來(lái)區(qū)分。
例如:
- 應(yīng)用 A 上下文路徑:
/→ 訪問(wèn)地址:http://domain/ - 應(yīng)用 B 上下文路徑:
/datav→ 訪問(wèn)地址:http://domain/datav/ - 應(yīng)用 C 上下文路徑:
/admin→ 訪問(wèn)地址:http://domain/admin/
三、前端 Vue.js 配置
1. 配置 Vue Router 基礎(chǔ)路徑
Vue Router 的 base 配置項(xiàng)用于設(shè)置路由的基礎(chǔ)路徑,所有路由都會(huì)自動(dòng)添加這個(gè)前綴。
// src/router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/view/Home.vue'
Vue.use(Router)
const router = new Router({
mode: 'history', // 必須使用 history 模式
base: process.env.NODE_ENV === 'production' ? '/datav/' : '/', // 根據(jù)環(huán)境動(dòng)態(tài)設(shè)置
routes: [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/dashboard',
name: 'Dashboard',
component: () => import('@/view/Dashboard.vue')
}
]
})
export default router2. 配置 Webpack 資源路徑
在 Vue CLI 2.x 中,通過(guò) config/index.js 的 assetsPublicPath 配置構(gòu)建后的資源路徑:
// config/index.js
module.exports = {
build: {
// ...
// 配置資源的公共訪問(wèn)路徑
assetsPublicPath: '/datav', // 生產(chǎn)環(huán)境上下文路徑
// ...
},
dev: {
// ...
assetsPublicPath: '/', // 開(kāi)發(fā)環(huán)境使用根路徑
// ...
}
}在 Vue CLI 3+ 中,通過(guò) vue.config.js 的 publicPath 配置:
// vue.config.js
module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? '/datav/' : '/',
// ...
}
3. 正確引用靜態(tài)資源
避免使用硬編碼的絕對(duì)路徑引用資源,這會(huì)導(dǎo)致資源加載失敗。
? 錯(cuò)誤的資源引用方式:
<!-- 硬編碼絕對(duì)路徑 --> <img src="/static/img/logo.png"> <!-- CSS 中硬編碼 --> background: url(/static/img/background.jpg);
? 正確的資源引用方式:
<!-- 相對(duì)路徑 -->
<img src="./static/img/logo.png">
<!-- 使用 require 方式(推薦) -->
<img :src="require('@/assets/img/logo.png')">
<!-- CSS 中使用相對(duì)路徑 -->
background: url(../img/background.jpg);4. API 請(qǐng)求路徑處理
確保 API 請(qǐng)求也能正確處理上下文路徑:
? 錯(cuò)誤的請(qǐng)求方式:
// 會(huì)請(qǐng)求到 http://domain/api/data,而非 http://domain/datav/api/data
axios.get('/api/data')
? 正確的請(qǐng)求方式:
// 方式 1:使用相對(duì)路徑(推薦)
axios.get('api/data') // 自動(dòng)帶上上下文路徑
// 方式 2:動(dòng)態(tài)構(gòu)建 API 基礎(chǔ)路徑
const apiBaseUrl = process.env.NODE_ENV === 'production' ? '/datav/api' : '/api'
axios.get(`${apiBaseUrl}/data`)
// 方式 3:配置 axios 基礎(chǔ)路徑
axios.defaults.baseURL = process.env.NODE_ENV === 'production' ? '/datav/api' : '/api'
axios.get('/data')四、后端服務(wù)器配置
前端配置完成后,后端服務(wù)器需要支持 URL 重寫,確保上下文路徑下的路由能正確指向?qū)?yīng)的項(xiàng)目。
1. Nginx 配置示例
server {
listen 80;
server_name your-domain.com;
# 主項(xiàng)目配置(上下文路徑:/)
location / {
root /path/to/main-project/dist;
index index.html;
try_files $uri $uri/ /index.html; # 處理 Vue history 模式
}
# 數(shù)據(jù)大屏項(xiàng)目配置(上下文路徑:/datav)
location /datav {
alias /path/to/dashboard-project/dist;
index index.html;
try_files $uri $uri/ /datav/index.html; # 注意包含上下文路徑的重寫
}
}2. Apache 配置示例
<VirtualHost *:80>
ServerName your-domain.com
# 主項(xiàng)目配置
DocumentRoot /path/to/main-project/dist
<Directory /path/to/main-project/dist>
AllowOverride All
Require all granted
RewriteEngine On
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</Directory>
# 數(shù)據(jù)大屏項(xiàng)目配置
Alias /datav /path/to/dashboard-project/dist
<Directory /path/to/dashboard-project/dist>
AllowOverride All
Require all granted
RewriteEngine On
RewriteBase /datav/
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /datav/index.html [L]
</Directory>
</VirtualHost>五、部署與驗(yàn)證
1. 構(gòu)建項(xiàng)目
# 構(gòu)建生產(chǎn)版本 npm run build
2. 部署到服務(wù)器
將構(gòu)建生成的 dist 目錄上傳到服務(wù)器的指定位置(與服務(wù)器配置中的路徑一致)。
3. 驗(yàn)證訪問(wèn)
- 訪問(wèn)主項(xiàng)目:
http://your-domain.com/ - 訪問(wèn)數(shù)據(jù)大屏:
http://your-domain.com/datav/ - 驗(yàn)證路由跳轉(zhuǎn):
http://your-domain.com/datav/dashboard - 驗(yàn)證資源加載:檢查頁(yè)面元素和網(wǎng)絡(luò)請(qǐng)求,確保資源都能正確加載
六、常見(jiàn)問(wèn)題與排查
1. 404 錯(cuò)誤(頁(yè)面刷新或直接訪問(wèn)路由)
原因:服務(wù)器沒(méi)有正確配置 URL 重寫規(guī)則。
解決:檢查服務(wù)器配置中的 try_files(Nginx)或 RewriteRule(Apache)是否正確。
2. 靜態(tài)資源加載失敗(CSS/JS/圖片)
原因:資源引用路徑錯(cuò)誤或 assetsPublicPath 配置不當(dāng)。
解決:確保 assetsPublicPath 與上下文路徑一致,避免硬編碼絕對(duì)路徑。
3. API 請(qǐng)求 404
原因:API 請(qǐng)求路徑?jīng)]有包含上下文路徑。
解決:使用相對(duì)路徑或動(dòng)態(tài)構(gòu)建 API 基礎(chǔ)路徑。
4. 路由跳轉(zhuǎn)錯(cuò)誤
原因:Vue Router 的 base 配置與實(shí)際上下文路徑不匹配。
解決:確保 base 配置與服務(wù)器部署的上下文路徑一致。
七、最佳實(shí)踐
- 開(kāi)發(fā)與生產(chǎn)環(huán)境分離:使用環(huán)境變量動(dòng)態(tài)配置上下文路徑,便于本地開(kāi)發(fā)和線上部署。
- 避免硬編碼:所有資源路徑和 API 請(qǐng)求都使用相對(duì)路徑或動(dòng)態(tài)構(gòu)建,避免硬編碼絕對(duì)路徑。
- 統(tǒng)一上下文路徑:前端的
base配置和后端的服務(wù)器配置必須使用相同的上下文路徑。 - 使用 Vue CLI 3+:新版本的 Vue CLI 提供了更簡(jiǎn)潔的配置方式,減少配置錯(cuò)誤。
- 測(cè)試完整流程:部署后測(cè)試所有路由、資源加載和 API 請(qǐng)求,確保完整功能正常。
八、總結(jié)
通過(guò)上下文路徑配置,我們可以在不開(kāi)啟新端口的情況下,在同一服務(wù)器上部署多個(gè) Vue 項(xiàng)目。關(guān)鍵在于:
- 前端:正確配置 Vue Router 的
base和 Webpack 的資源路徑。 - 后端:配置服務(wù)器的 URL 重寫規(guī)則,支持上下文路徑。
這種部署方式不僅節(jié)省了服務(wù)器資源,還便于統(tǒng)一管理和維護(hù)多個(gè)相關(guān)項(xiàng)目。希望本文能幫助你順利完成多項(xiàng)目同端口部署任務(wù)!
到此這篇關(guān)于Vue.js 多項(xiàng)目同端口部署實(shí)戰(zhàn)指南(上下文路徑配置指南)的文章就介紹到這了,更多相關(guān)vue.js多項(xiàng)目同端口部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目webpack中Npm傳遞參數(shù)配置不同域名接口
這篇文章主要介紹了vue項(xiàng)目webpack中Npm傳遞參數(shù)配置不同域名接口,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
vue?electron實(shí)現(xiàn)無(wú)邊框窗口示例詳解
這篇文章主要為大家介紹了vue?electron實(shí)現(xiàn)無(wú)邊框窗口示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Vue頁(yè)面跳轉(zhuǎn)動(dòng)畫效果的實(shí)現(xiàn)方法
百度了好久都沒(méi)辦法實(shí)現(xiàn)vue中一個(gè)頁(yè)面跳到另一個(gè)頁(yè)面,甚至到google上搜索也是沒(méi)辦法的,最終還是找了高人親自指導(dǎo),所以下面這篇文章主要給大家介紹了關(guān)于Vue頁(yè)面跳轉(zhuǎn)動(dòng)畫效果的實(shí)現(xiàn)方法,需要的朋友可以參考下2018-09-09
vue通過(guò)elementUI組件實(shí)現(xiàn)圖片預(yù)覽效果
我們?cè)陂_(kāi)發(fā)中經(jīng)常會(huì)遇到通過(guò)點(diǎn)擊某個(gè)按鈕或者文字實(shí)現(xiàn)圖片的預(yù)覽功能,這里我們分別介紹vue2和vue3里面如何實(shí)現(xiàn)圖片預(yù)覽方法,需要的朋友可以參考下2023-09-09
使用vue官方提供的模板vue-cli搭建一個(gè)helloWorld案例分析
這篇文章主要介紹了用vue官方提供的模板vue-cli搭建一個(gè)helloWorld案例,需要的朋友可以參考下2018-01-01
Vue3結(jié)合TypeScript項(xiàng)目開(kāi)發(fā)實(shí)踐總結(jié)
本文主要介紹了Vue3結(jié)合TypeScript項(xiàng)目開(kāi)發(fā)實(shí)踐總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

