vue項目之webpack打包靜態(tài)資源路徑不準確的問題
webpack打包靜態(tài)資源路徑不準確
問題
1.將打包好的項目部署到服務器,發(fā)現(xiàn)報錯說圖片找不到。
![]()
2.靜態(tài)資源如js訪問不到
分析并且解決問題
明確一點的就是,看到報錯404,找不到靜態(tài)資源,很明顯,路徑錯誤了。
靜態(tài)資源找不到如js文件
資源打包路徑有誤,打包后的資源使用了絕對根目錄路徑,因此將項目部署到特定目錄下,其引入的資源路徑無法被正確解析。
解決:
找到config下面的index.js文件,將劃線處改為如下樣子。

之前是根目錄,肯定找不到文件,我們改成相對目錄即可。打包后,去看看index.html中引入的文件就知道變化了。
圖片找不到
首先我們來看一下我們打包后生成的文件目錄:

上面的報錯,要是沒有static/css就完全可以找到圖片了。但是為什么有的圖片能夠找得到有的圖片找不到呢,同樣的方法寫在css文件里面。這里我們就要了解一下webpack在打包我們的文件時候進行的操作了。
webpack打包limit限制

limit值為10000,表示字節(jié)。什么作用呢?就是小于這個字節(jié)限制的,不是不打包,而是轉化為base64(css樣式中,圖片的代碼變成了一堆字符)。大于的話就正常打包,加上7位hash值,就變成如下路徑。

跑到了img下面去了,img這個名字就是我們上面webpack配置的。這樣路徑就不對了,所以找不到圖片。
從源頭分析問題
在vue項目中,我們打包生成項目,跑命令如下。
npm run build
那么,我們就看看在執(zhí)行這個命令中,運行的代碼,以此入手。找到config下面的index.js文件

打包后生成的文件代碼:

最開始,我們的assetsPublicPath值為'/',表示根目錄,我們看看打包后的文件樣子。
![]()
這樣直接從根目錄獲取,我們將項目部署到服務器上都是有名字的,這樣直接到服務器根目錄肯定不能獲取。
解決圖片路徑錯誤辦法
在build文件夾下面找到utils.js文件,如下圖

新增紅色的部分,這樣打包的樣子就變成../../static的樣子了,就可以解決我們的問題。
webpack中的靜態(tài)資源處理
你可能已經(jīng)注意到,在我們的項目結構里,有兩個靜態(tài)文件的路徑,分別是:src/assets 和 static/。那這兩個到底有什么區(qū)別呢?
Webpacked 資源
為了回答這個問題,我們首先需要理解webpack是怎樣處理靜態(tài)資源的。在*.vue組件中,所有的templates和css都會被vue-html-loader 和 css-loader解析,尋找資源的URL。舉個例子,在<img src="./logo.png"> 和 background: url(./logo.png), "./logo.png"中,都是相對資源路徑,都會被Webpack解析成模塊依賴 。
由于logo.png不是JavaScript,當被看成一個模塊依賴的時候,我們需要使用url-loader 和 file-loader進行處理。 該模板已經(jīng)配置好了這些loaders,所以你能夠使用相對/模塊路徑時不需要擔心部署的問題。 (This boilerplate has already configured these loaders for you, so you basically get features such as filename fingerprinting and conditional base64 inlining for free, while being able to use relative/module paths without worrying about deployment.)
由于這些資源可能在構建的時候被內聯(lián)/復制/重命名, 所以它們從本質上來說是你源碼的一部分。這就是為什么我們建議將交由webpack處理的靜態(tài)資源和其它源文件一樣放在/src路徑下面。實際上,你甚至不需要把它們全都放在/src/assets路徑下:你可以基于模塊/組件的使用來組織文件結構。例如,你可以把每個組件和屬于它的靜態(tài)資源放在它自己的目錄下。
資源處理規(guī)則
- 相對URL, e.g. ./assets/logo.png 將會被解釋成一個模塊依賴。它們會被一個基于你的Webpack輸出配置自動生成的URL替代。
- 沒有前綴的URL, e.g. assets/logo.png 將會被看成相對URL,并且轉換成./assets/logo.png
- 前綴帶~的URL 會被當成模塊請求, 類似于require('some-module/image.png'). 如果你想要利用Webpack的模塊處理配置,就可以使用這個前綴。例如,如果你有一個對于assets的路徑解析,你需要使用<img src="~assets/logo.png">來確保解析是對應上的。
- 相對根目錄的URL, e.g. /assets/logo.png 是不會被處理的.
在JavaScript里獲取資源路徑
為了能讓Webpack返回正確的資源路徑,你需要使用require('./relative/path/to/file.jpg'),由file-loader進行解析,然后返回處理過的URL。例如:
computed: {
? background () {
? ? return require('./bgs/' + this.id + '.jpg')
? }
}"真實的" 靜態(tài)資源
作為對比,在static/下的文件都不會被Webpack處理:它們使用相同的文件名,直接拷貝到最終的路徑。你必須使用絕對路徑來引用這些文件,取決于在config.js里面加入的build.assetsPublicPath 和 build.assetsSubDirectory。
舉個例子,下面的默認值是:
注意上面的例子,在最終的構建時將會包含./bgs/路徑下的所有圖片 這是因為Webpack不能猜出來在運行時會用到其中的哪個,所以會包含所有的。
// config/index.js
module.exports = {
? // ...
? build: {
? ? assetsPublicPath: '/',
? ? assetsSubDirectory: 'static'
? }
}所有放在 static/目錄下的文件都應該是使用絕對URL/static/[filename]引用的。如果你將assetSubDirectory的值改成assets, 那么這些URL就會被變成 /assets/[filename]
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Webpack常見靜態(tài)資源處理-模塊加載器(Loaders)+ExtractTextPlugin插件
- 詳解vue-cli與webpack結合如何處理靜態(tài)資源
- vue-cli與webpack處理靜態(tài)資源的方法及webpack打包的坑
- vue填坑之webpack run build 靜態(tài)資源找不到的解決方法
- 淺談webpack4 圖片處理匯總
- webpack 靜態(tài)資源集中輸出的方法示例
- 淺談 Webpack 如何處理圖片(開發(fā)、打包、優(yōu)化)
- 在Webpack中用url-loader處理圖片和字體的問題
- webpack實現(xiàn)靜態(tài)資源緩存的方法
- webpack5處理圖片、圖標字體、多媒體等靜態(tài)資源文件
相關文章
解決el-tree數(shù)據(jù)回顯時子節(jié)點部分選中父節(jié)點都全選中的坑
本文主要介紹了解決el-tree數(shù)據(jù)回顯時子節(jié)點部分選中父節(jié)點都全選中的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08
Vue項目中Api的組織和返回數(shù)據(jù)處理的操作
這篇文章主要介紹了Vue項目中Api的組織和返回數(shù)據(jù)處理的操作,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
Vue.js中Line第三方登錄api的實現(xiàn)代碼
這篇文章主要介紹了Vue.js中Line第三方登錄api實現(xiàn)代碼,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
vue2+element?ui?中的el-table?選中當前行當前行變色的實現(xiàn)代碼
這篇文章主要介紹了vue2+element?ui?中的el-table?選中當前行當前行變色的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-07-07
Vue中使用ElementUI使用第三方圖標庫iconfont的示例
這篇文章主要介紹了Vue中使用ElementUI使用第三方圖標庫iconfont的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Vue實現(xiàn)下拉滾動加載數(shù)據(jù)的示例
這篇文章主要介紹了Vue實現(xiàn)下拉滾動加載數(shù)據(jù)的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下2021-04-04

