本文主要解決
①.vue-cli預設配置打包後部署至特定路徑下靜態資源路徑錯誤問題;
②.靜態資源打包使用相對路徑後css檔案引入大圖片路徑錯誤問題。
- 問題
vue-cli 腳手架生成的預設打包配置檔案情況下執行 npm run build 打包後,部署專案至特定路徑下:如:
//ip:port/public/springActivity/
複製程式碼
此時訪問:
http://ip:port/public/springActivity/index.html
複製程式碼
index.html 可以正常訪問,但是引用的js,css等檔案伺服器響應均為404,檢視引入的資源路徑如下:
http://ip:port/static/css/app.cea07642cd24c0d7a5c4b9b7afc7ff64.css
http://ip:port/static/js/app.815851e87b083afb82bf.js
複製程式碼
- 分析
由上可以看出是資源打包路徑有誤,打包後的資源使用了絕對根目錄路徑,因此將專案部署到特定目錄下,其引入的資源路徑無法被正確解析。
- 解決
在打包時需要使用相對路徑來處理靜態資源,更改build中資源釋出路徑配置(config/index.js, build物件):
將 assetsPublicPath: '/' 改為 assetsPublicPath: './',
複製程式碼
再次打包,並將資源部署到特定路徑下,然後訪問:
此時index.html可以正常訪問,同時js和css資源也可以正常訪問,但是css中引入的assets目錄下的大圖片資源出錯了(服務端404).
- 再分析
檢視引入的圖片資源路徑如下:
http://ip:port/public/springActivity/static/css/static/img/question_bg.61a2825.png
複製程式碼
實際專案中資源路徑如下:
index.html
static/
|--js/
|--*.js
|--css/
|--*.css
|--img/
|--*.png
複製程式碼
很明顯圖片引入路徑有誤。分析圖片引入路徑,發現路徑均多了"/static/css"兩層目錄,猜測是css目錄下的css檔案引入圖片路徑為"static/img/question_bg.61a2825.png" , 檢視css檔案,css中引入圖片路徑如下:
background:url(static/img/question_bg.61a2825.png)
複製程式碼
- 再解決
css檔案中路徑存在問題,肯定又是打包哪個環節資源路徑沒有配置好,分析打包過程,css是在js中引入的或是寫在vue檔案中的,css檔案首先被less,postcss等處理,處理後會被ExtractTextPlugin處理,ExtractTextPlugin將js中的css全部抽離至app.css檔案中。
首先將options.extract設為false,關閉抽離css功能,再次打包並部署至特定目錄,訪問:http://ip:port/public/springActivity/index.html, 啪,頁面正常顯示,大公即將告成。
分析打包後的檔案,發現沒有了css檔案,發現css檔案全部在app.js檔案中;通過js將css注入 index.html檔案中,因此css檔案中引入的圖片資源路徑應該是相對於index.html檔案路徑的,即:"static/img/question_bg.61a2825.png",這與下面css檔案中的圖片資源路徑一致,因此圖片能夠被正常訪問。
background:url(static/img/question_bg.61a2825.png)
複製程式碼
現在很確定知道問題出在哪了,即:ExtractTextPlugin抽離css檔案時沒有轉換資源引入路徑,導致app.css引入了相對app.css目錄為"static/img/.png"的靜態資源,該路徑相對index.html即為:static/css/static/img/.png。
因此使用ExtractTextPlugin外掛時還需要配置靜態資源路徑引數,通過查詢資料,得知可以通過新增publicPath:"../../"解決該問題:
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath:"../../" //新增
})
}
複製程式碼
打包部署到特定目錄下後訪問index.html檔案,頁面一切正常,app.css檔案正常引入,圖片資源也正常引入,檢視app.css檔案引入圖片資源方式如下:
background:url(../../static/img/question_bg.61a2825.png
複製程式碼
publicPath配置後,css檔案中引入的圖片檔案路徑前新增了該路徑配置;
publicPath 屬性值為打包後的 app.css檔案至index.html檔案的相對路徑
圖片資源也可以直接放在vue-cli生成的static目錄下規避上述問題,但是通過這種方式圖片名稱中無法增加md5字串,不利於版本控制