vite修仙傳5-靜態(tài)資源處理

靜態(tài)資源處理?

將資源引入為 URL?

服務(wù)時(shí)引入一個(gè)靜態(tài)資源會(huì)返回解析后的公共路徑:

js

import imgUrl from './img.png'
document.getElementById('hero-img').src = imgUrl

例如埂伦,imgUrl 在開發(fā)時(shí)會(huì)是 /img.png,在生產(chǎn)構(gòu)建后會(huì)是 /assets/img.2d8efhg.png朴读。

行為類似于 Webpack 的 file-loader斑举。區(qū)別在于導(dǎo)入既可以使用絕對(duì)公共路徑(基于開發(fā)期間的項(xiàng)目根路徑),也可以使用相對(duì)路徑。

  • url() 在 CSS 中的引用也以同樣的方式處理楞慈。

  • 如果 Vite 使用了 Vue 插件,Vue SFC 模板中的資源引用都將自動(dòng)轉(zhuǎn)換為導(dǎo)入啃擦。

  • 常見的圖像囊蓝、媒體和字體文件類型被自動(dòng)檢測(cè)為資源。你可以使用 assetsInclude 選項(xiàng) 擴(kuò)展內(nèi)部列表议惰。

  • 引用的資源作為構(gòu)建資源圖的一部分包括在內(nèi)慎颗,將生成散列文件名,并可以由插件進(jìn)行處理以進(jìn)行優(yōu)化言询。

  • 較小的資源體積小于 assetsInlineLimit 選項(xiàng)值 則會(huì)被內(nèi)聯(lián)為 base64 data URL俯萎。

  • Git LFS 占位符會(huì)自動(dòng)排除在內(nèi)聯(lián)之外,因?yàn)樗鼈儾话鼈兯硎镜奈募膬?nèi)容运杭。要獲得內(nèi)聯(lián)夫啊,請(qǐng)確保在構(gòu)建之前通過 Git LFS 下載文件內(nèi)容。

  • 默認(rèn)情況下辆憔,TypeScript 不會(huì)將靜態(tài)資源導(dǎo)入視為有效的模塊撇眯。要解決這個(gè)問題,需要添加 vite/client虱咧。

顯式 URL 引入?

未被包含在內(nèi)部列表或 assetsInclude 中的資源熊榛,可以使用 ?url 后綴顯式導(dǎo)入為一個(gè) URL。這十分有用腕巡,例如玄坦,要導(dǎo)入 Houdini Paint Worklets 時(shí):

js

import workletURL from 'extra-scalloped-border/worklet.js?url'
CSS.paintWorklet.addModule(workletURL)

將資源引入為字符串?

資源可以使用 ?raw 后綴聲明作為字符串引入。

js

import shaderString from './shader.glsl?raw'

導(dǎo)入腳本作為 Worker?

腳本可以通過 ?worker?sharedworker 后綴導(dǎo)入為 web worker。

js

// 在生產(chǎn)構(gòu)建中將會(huì)分離出 chunk
import Worker from './shader.js?worker'
const worker = new Worker()

js

// sharedworker
import SharedWorker from './shader.js?sharedworker'
const sharedWorker = new SharedWorker()

js

// 內(nèi)聯(lián)為 base64 字符串
import InlineWorker from './shader.js?worker&inline'

查看 Web Worker 小節(jié) 獲取更多細(xì)節(jié)煎楣。

public 目錄?

如果你有下列這些資源:

  • 不會(huì)被源碼引用(例如 robots.txt
  • 必須保持原有文件名(沒有經(jīng)過 hash)
  • ...或者你壓根不想引入該資源豺总,只是想得到其 URL。

那么你可以將該資源放在指定的 public 目錄中择懂,它應(yīng)位于你的項(xiàng)目根目錄喻喳。該目錄中的資源在開發(fā)時(shí)能直接通過 / 根路徑訪問到,并且打包時(shí)會(huì)被完整復(fù)制到目標(biāo)目錄的根目錄下困曙。

目錄默認(rèn)是 <root>/public表伦,但可以通過 publicDir 選項(xiàng) 來配置。

請(qǐng)注意:

  • 引入 public 中的資源永遠(yuǎn)應(yīng)該使用根絕對(duì)路徑 —— 舉個(gè)例子慷丽,public/icon.png 應(yīng)該在源碼中被引用為 /icon.png绑榴。
  • public 中的資源不應(yīng)該被 JavaScript 文件引用。

new URL(url, i<wbr style="box-sizing: border-box;">mport.meta.url)?

i<wbr style="box-sizing: border-box;">mport.meta.url 是一個(gè) ESM 的原生功能盈魁,會(huì)暴露當(dāng)前模塊的 URL。將它與原生的 URL 構(gòu)造器 組合使用窃诉,在一個(gè) JavaScript 模塊中杨耙,通過相對(duì)路徑我們就能得到一個(gè)被完整解析的靜態(tài)資源 URL:

js

const imgUrl = new URL('./img.png', import.meta.url).href

document.getElementById('hero-img').src = imgUrl

這在現(xiàn)代瀏覽器中能夠原生使用 - 實(shí)際上,Vite 并不需要在開發(fā)階段處理這些代碼飘痛!

這個(gè)模式同樣還可以通過字符串模板支持動(dòng)態(tài) URL:

js

function getImageUrl(name) {
  return new URL(`./dir/${name}.png`, import.meta.url).href
}

在生產(chǎn)構(gòu)建時(shí)珊膜,Vite 才會(huì)進(jìn)行必要的轉(zhuǎn)換保證 URL 在打包和資源哈希后仍指向正確的地址。然而宣脉,這個(gè) URL 字符串必須是靜態(tài)的车柠,這樣才好分析。否則代碼將被原樣保留塑猖、因而在 build.target 不支持 i<wbr style="box-sizing: border-box;">mport.meta.url 時(shí)會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤竹祷。

js

// Vite 不會(huì)轉(zhuǎn)換這個(gè)
const imgUrl = new URL(imagePath, import.meta.url).href

注意:無法在 SSR 中使用

如果你正在以服務(wù)端渲染模式使用 Vite 則此模式不支持,因?yàn)?i<wbr style="box-sizing: border-box;">mport.meta.url 在瀏覽器和 Node.js 中有不同的語義羊苟。服務(wù)端的產(chǎn)物也無法預(yù)先確定客戶端主機(jī) URL塑陵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜡励,隨后出現(xiàn)的幾起案子令花,更是在濱河造成了極大的恐慌,老刑警劉巖凉倚,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兼都,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稽寒,警方通過查閱死者的電腦和手機(jī)扮碧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓦胎,“玉大人芬萍,你說我怎么就攤上這事尤揣。” “怎么了柬祠?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵北戏,是天一觀的道長。 經(jīng)常有香客問我漫蛔,道長嗜愈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任莽龟,我火速辦了婚禮蠕嫁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毯盈。我一直安慰自己剃毒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布搂赋。 她就那樣靜靜地躺著赘阀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脑奠。 梳的紋絲不亂的頭發(fā)上基公,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音宋欺,去河邊找鬼轰豆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛齿诞,可吹牛的內(nèi)容都是我干的酸休。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祷杈,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雨席!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吠式,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤陡厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后特占,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糙置,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年是目,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谤饭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖揉抵,靈堂內(nèi)的尸體忽然破棺而出亡容,到底是詐尸還是另有隱情,我是刑警寧澤冤今,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布闺兢,位于F島的核電站,受9級(jí)特大地震影響戏罢,放射性物質(zhì)發(fā)生泄漏屋谭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一龟糕、第九天 我趴在偏房一處隱蔽的房頂上張望桐磁。 院中可真熱鬧,春花似錦讲岁、人聲如沸我擂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶踊。三九已至,卻和暖如春郎任,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背备籽。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工舶治, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人车猬。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓霉猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珠闰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惜浅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容