Vue項(xiàng)目字體文件打包后fonts文件夾消失的原因分析與解決方案
問題
在 Vue 項(xiàng)目中,將字體文件放在 src/assets/fonts 目錄下,打包后在瀏覽器中訪問發(fā)現(xiàn)路徑里“不見了 fonts”文件夾,這通常不是文件丟失,而是 Vue 的構(gòu)建工具(Webpack 或 Vite)對(duì)靜態(tài)資源進(jìn)行了自動(dòng)化處理。
導(dǎo)致這種情況主要有以下兩個(gè)原因:
原因一:小體積字體被轉(zhuǎn)成了 Base64(最常見)
Vue 的構(gòu)建工具默認(rèn)會(huì)對(duì) assets 目錄下的靜態(tài)資源進(jìn)行優(yōu)化。如果你的字體文件體積較?。ɡ缧∮?4KB 或 8KB,具體取決于配置),構(gòu)建工具會(huì)直接將其轉(zhuǎn)換成 Base64 編碼的字符串,并內(nèi)嵌到打包后的 CSS 文件中。
- 現(xiàn)象:瀏覽器訪問時(shí),根本不會(huì)發(fā)起對(duì)
.woff或.ttf字體文件的網(wǎng)絡(luò)請(qǐng)求,因?yàn)樽煮w數(shù)據(jù)已經(jīng)包含在 CSS 里了。 - 結(jié)論:這是正常的優(yōu)化機(jī)制,能減少 HTTP 請(qǐng)求次數(shù),提升加載速度,無(wú)需修復(fù)。
原因二:文件被重命名并提取到了根目錄
如果字體文件較大,構(gòu)建工具會(huì)將其作為獨(dú)立的資源文件打包。為了防止瀏覽器緩存導(dǎo)致更新不生效,構(gòu)建工具默認(rèn)會(huì)給文件名加上一串哈希值(如 MyFont.a1b2c3d4.woff)。同時(shí),根據(jù)你的打包配置,這些資源可能會(huì)被直接提取到 dist 的根目錄或 static 目錄下,而不再保留原本的 fonts 文件夾結(jié)構(gòu)。
- 現(xiàn)象:在瀏覽器 Network 面板中看到的請(qǐng)求路徑可能是
/a1b2c3d4.woff,而不是/fonts/MyFont.woff。 - 結(jié)論:只要瀏覽器能正常加載出字體(狀態(tài)碼 200),且頁(yè)面上字體顯示正常,就說明路徑解析是成功的。
如果你確實(shí)需要保留fonts目錄結(jié)構(gòu)
如果你希望打包后的路徑嚴(yán)格保持 /fonts/xxx.woff 的結(jié)構(gòu),可以通過以下兩種方式解決:
方案 1:將字體文件移至 public 目錄(推薦)public 目錄下的文件在打包時(shí)會(huì)原封不動(dòng)地復(fù)制到 dist 目錄,不會(huì)經(jīng)過構(gòu)建工具的處理(不會(huì)被轉(zhuǎn) Base64 或重命名)。
- 在根目錄的
public文件夾下新建一個(gè)fonts文件夾,將字體文件放進(jìn)去。 - 在 CSS 中使用絕對(duì)路徑引用:
@font-face {
font-family: 'MyFont';
/* 這里的 /fonts/ 對(duì)應(yīng) public/fonts/ */
src: url('/fonts/MyFont.woff2') format('woff2');
}
方案 2:修改構(gòu)建配置(針對(duì) Webpack/Vue CLI)
如果你堅(jiān)持使用 src/assets,可以在 vue.config.js 中修改 url-loader 或 file-loader 的配置,強(qiáng)制指定輸出目錄并關(guān)閉 Base64 轉(zhuǎn)換(將 limit 設(shè)為 0):
// vue.config.js
module.exports = {
chainWebpack: config => {
const fontsRule = config.module.rule('fonts');
fontsRule.uses.clear(); // 清除默認(rèn)配置
fontsRule
.test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i)
.use('url-loader')
.loader('url-loader')
.options({
limit: 0, // 關(guān)閉 Base64 轉(zhuǎn)換
name: 'fonts/[name].[hash:8].[ext]' // 強(qiáng)制輸出到 fonts 目錄下
});
}
};
建議:
你可以先打開瀏覽器的開發(fā)者工具(F12),切換到 Network(網(wǎng)絡(luò)) 面板,刷新頁(yè)面查看字體文件是否返回了 200 狀態(tài)碼。如果字體能正常顯示且沒有報(bào) 404 錯(cuò)誤,建議保持現(xiàn)狀即可,這屬于構(gòu)建工具的正常優(yōu)化行為。
以上就是Vue項(xiàng)目字體文件打包后fonts文件夾消失的原因分析與解決方案的詳細(xì)內(nèi)容,更多關(guān)于Vue字體文件打包后fonts文件夾消失的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能
這篇文章主要為大家詳細(xì)介紹了Vue如何使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能,文中的實(shí)現(xiàn)步驟講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-04-04
關(guān)于webpack-dev-server配置代理解決前端開發(fā)中的跨域問題
這篇文章主要介紹了關(guān)于webpack-dev-server配置代理解決前端開發(fā)中的跨域問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
vue2.x 通過后端接口代理,獲取qq音樂api的數(shù)據(jù)示例
今天小編就為大家分享一篇vue2.x 通過后端接口代理,獲取qq音樂api的數(shù)據(jù)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10
elementUI select組件使用及注意事項(xiàng)詳解
這篇文章主要介紹了elementUI select組件使用及注意事項(xiàng)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
vue自定義組件實(shí)現(xiàn)v-model雙向綁定數(shù)據(jù)的實(shí)例代碼
vue中父子組件通信,都是單項(xiàng)的,直接在子組件中修改prop傳的值vue也會(huì)給出一個(gè)警告,接下來就用一個(gè)小列子一步一步實(shí)現(xiàn)了vue自定義的組件實(shí)現(xiàn)v-model雙向綁定,需要的朋友可以參考下2021-10-10
vue實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)動(dòng)態(tài)菜單
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)動(dòng)態(tài)菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
vue2使用思維導(dǎo)圖jsmind的詳細(xì)代碼
jsMind是一個(gè)基于Js的思維導(dǎo)圖庫(kù),jsMind是一個(gè)純JavaScript類庫(kù),用于創(chuàng)建、展示和操作思維導(dǎo)圖,這篇文章主要給大家介紹了關(guān)于vue2使用思維導(dǎo)圖jsmind的詳細(xì)代碼,需要的朋友可以參考下2024-06-06
vue 輸入電話號(hào)碼自動(dòng)按3-4-4分割功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 輸入電話號(hào)碼自動(dòng)按3-4-4分割功能的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

