詳解vue靜態資源打包中的坑與解決方案

  本文主要解決:css

  一、vue-cli默認配置打包後部署至特定路徑下靜態資源路徑錯誤問題;html

  二、靜態資源打包使用相對路徑後css文件引入圖片路徑錯誤問題。vue

1、問題
spring

  vue-cli 腳手架生成的默認打包配置文件狀況下運行 npm run build 打包後,部署項目至特定路徑下:如://ip:port/public/springActivity/
vue-cli

  此時訪問:http://ip:port/public/springActivity/index.html
npm

  index.html 能夠正常訪問,可是引用的js,css等文件服務器響應均爲404,查看引入的資源路徑以下:服務器

  http://ip:port/static/css/app.cea07642cd24c0d7a5c4b9b7afc7ff64.css
  http://ip:port/static/js/app.815851e87b083afb82bf.js
app

2、分析
less

  由上能夠看出是資源打包路徑有誤,打包後的資源使用了絕對根目錄路徑,所以將項目部署到特定目錄下,其引入的資源路徑沒法被正確解析。post

3、解決

  在打包時須要使用相對路徑來處理靜態資源,更改build中資源發佈路徑配置(config/index.js, build對象):

  將 assetsPublicPath: '/'  改成  assetsPublicPath: './',再次打包,並將資源部署到特定路徑下,而後訪問,此時index.html能夠正常訪問,同時js和css資源也能夠正常訪問,可是css中引入的assets目錄下的大圖片資源出錯了(服務端404)

4、再分析

  查看引入的圖片資源路徑以下: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)

5、再解決

  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文件中的圖片資源路徑一致,所以圖片可以被正常訪問。

  如今很肯定知道問題出在哪了,即:ExtractTextPlugin抽離css文件時沒有轉換資源引入路徑,致使app.css引入了相對app.css目錄爲"static/img/ .png"的靜態資源,該路徑相對index.html即爲:static/css/static/img/ .png。

  所以使用ExtractTextPlugin插件時還須要配置靜態資源路徑參數,經過查詢資料,得知能夠經過添加publicPath:"../../"解決該問題:須要修改build文件夾下的utils.js代碼,如圖所示:

  打包部署到特定目錄下後訪問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字符串,不利於版本控制。

相關文章
相關標籤/搜索